2个问题:
1)我的视图文件中的Recent Posts功能(针对单个帖子页面)不再显示帖子 2)在显示所有帖子的文章页面上,没有slug的帖子不起作用。当我点击帖子时,它会重定向到/ articles。只有带有slug的帖子才有效。
我的帖子有两种网址:slug和url。区别?网址较长。 Slug较短,用于搜索引擎优化目的。为什么不使用slug?因为对于某些帖子,我不想浪费时间创造一个slu ..这些帖子的slug列中的数据为空/空。生成的网址很好。对于其他帖子,我想制作一个slu ..
这是我的帖子控制器代码。
旧版本:
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);
}
新版本(已修改):
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);
}
新修改的控制器文件在没有slug的情况下打破了帖子。
以下是最近发布的帖子的视图文件:
<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
我的路线代码:
Route::get('articles/{url}', 'postsController@viewpost');
我的帖子页面的视图文件代码显示了所有帖子:
@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
答案 0 :(得分:2)
1)我的视图文件中的Recent Posts功能(针对单个帖子页面)不再显示帖子。
那是因为与您的旧代码不同,您不会检索数据:
$posts = posts::where('post_status', '');
这只会返回您的查询Builder对象,因此要获取这些帖子,您需要添加 - &gt; get();获取集合,代码变为:
$posts = posts::where('post_status', '')->get();
之后你可以通过filtring收集过滤你所寻找的一个帖子( - &gt; first()),因为它不支持orWhere方法(或者只使用两个where()作为你在旧代码中做了):
$post = $posts->filter(function($object, $key) use ($url) {
return !strcmp($object->url, 'articles/'.$url) or !strcmp($object->slug, $url);
})->first();
同样正确:
@foreach($post as $post)
2)在显示所有帖子的文章页面上,没有slug的帖子不起作用。当我点击帖子时,它会重定向到/ articles。只有带有slug的帖子才有效。
我不确定,但我在您的代码中看到了什么,并且基于您在上面显示的旧方法,我认为您在这里遇到了问题:
<a href="{{'articles/'.$post->slug}}" ...
<a href="{{($post->url)}}" ...
第二个人也不需要(?):
<a href="{{'articles/'.$post->url}}" ...
答案 1 :(得分:0)
这可能是导致因素:
return view('viewpost')->with('post', $post)->with('posts', $posts);
你的循环在做:
@foreach($posts as $post)
而你的另一个循环正在做:
@foreach($post as $post)
如果你看with
post
,那么posts
和with
都会传递,因此可能会将循环变量与with
变量混合。
尝试将_
中变量的键更改为更加明显的键。您可以在单个$post
变量之前添加/blog
。