2 problems:
1) the Recent Posts function in my view file (for the single post page) no longer shows posts.
2) On the articles page which shows all of the posts, the posts with no slug do not work. when I click on the post, it redirects to /articles. Only posts with a slug work.
I have 2 kinds of URLs for my posts: slug and url. The difference? URL is longer. Slug is shorter and used for SEO purposes. Why not use just slug? Because for some posts, I don’t want to waste time creating a slug. The data in the slug column for those posts is blank/empty. The generated url is fine. For other posts, I want a slug made.
Here is my controller code for posts.
Old version:
public function viewpost($url,$slug){
if ( empty($slug) ) {
$url ='articles/'.$url;
} else {
$url = 'articles/'.$slug;
}
$posts = posts::where('post_status', '')->get();
if ( empty($slug) ) {
$post = $posts->where('url', $url)->first();
} else {
$post = $posts->where('slug', $slug)->first();
}
if ( empty($post) )
return redirect()->back();
return view('viewpost')->with('post', $post)->with('posts', $posts);
}
New version (modified):
public function viewpost($url){
$posts = posts::where('post_status', '');
$post = $posts->where('url', $url)->orWhere('slug' , $url)->first();
if ( empty($post) )
return redirect()->back();
return view('viewpost')->with('post', $post)->with('posts', $posts);
}
The new modified controller file broke the posts without a slug.
Here is the view file for the Recent Posts which broke:
<h3>Recent Posts</h3>
@foreach($posts as $post)
<p><a href="{{ URL::to($post->url) }}"><img style="width:100px;" src="{{asset('thumbnails/'.$post->thumbnail)}}" class="responsive"></a><br>
<a href="{{ URL::to($post->url) }}">{{substr(($post->title),0,88)}}..
</a></p>
@endforeach
My Routes code:
Route::get('articles/{url}', 'postsController@viewpost');
My view file code for the posts page which displays all the posts:
@foreach($post as $post)
<div class="col-md-4">
<div class="content">
@if(!empty($post->slug))
dd(11);
<a href="{{'articles/'.$post->slug}}" class="latest-heading">{{substr(($post->title),0,88)}}..</a>
@else
dd(22);
<a href="{{($post->url)}}" class="latest-heading">{{substr(($post->title),0,88)}}..</a>
@endif
<img style="padding: 5px; width:100%; height:218px;" src="{{asset('thumbnails/'.$post->thumbnail)}}" class="img-responsive">
</div>
</div>
@endforeach
2
Answers
This is probably the causing factor:
and your loop is doing:
and your other loop is doing:
If you look at your
with
you are passing bothpost
andposts
, as a result it is probably mixing the looped variable with thewith
variable.Try and change the keys of the variables in the
with
to something more distinct. You could add an_
before the single$post
variable.That’s because unlike your old code, you’re not retrieving the data:
This will only return your query Builder object, so to get those posts, you need to add ->get(); to get the collection, so the code becomes:
After that you can filter the one post your looking for via (->first()), by filtring the collection, as it doesn’t support the orWhere method (or just use two where() as you did in the old code):
Also correct that:
I’m not sure but what i saw in your code, and basing on the old method you showed above, I think you have a problem here:
doesn’t the second one needs also to be (?):