我正在尝试根据帖子获取帖子的相关帖子。
我的帖子(id 1)附有几个标签,即标签(id 1-3),这意味着我的帖子有3个标签。基于这些标签,我想展示其他有此标签的帖子。
我的标签型号:
<?php namespace Digitus\Base\Model;
class Tag extends \Eloquent{
protected $table = 'tags';
protected $guarded = ['id'];
protected $fillable = ['name'];
public function posts()
{
$this->belongsToMany('Digitus\Base\Model\Post');
}
}
我的帖子模型:
<?php namespace Digitus\Base\Model;
class Post extends \Eloquent {
protected $fillable = array('title','body', 'author','slug');
public function user()
{
return $this->belongsTo('Digitus\Base\Model\User', 'author');
}
public function tags()
{
return $this->belongsToMany('Digitus\Base\Model\Tag');
}
public function comments()
{
return $this->belongsToMany('Digitus\Base\Model\Comment');
}
public function categories()
{
return $this->belongsToMany('Digitus\Base\Model\Categorie');
}
}
在我看来,我目前有:
<div class="col-xs-8 col-sm-8 col-md-8 col-lg-8 panel panel-info">
<p>Gerelateerde berichten:</p>
<?php
$posts = Digitus\Base\Model\Post::all();
$tags = Digitus\Base\Model\Tag::all(); ?>
@foreach($posts as $post)
@foreach($post->tags as $tag)
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">{{ $post->title }}</div>
@endforeach
@endforeach
</div>
但它并没有真正显示具有相同标签的帖子,它只是抛出我的所有帖子。此外,我尝试添加某种过滤器,因此不会有任何重复的帖子(相同的帖子显示2次以上),但这也失败了。
我不是在寻找直接的答案,更多的是寻找方向和建议等。
答案 0 :(得分:0)
在此代码中:
@foreach($posts as $post)
@foreach($post->tags as $tag)
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">{{ $post->title }}</div>
@endforeach
@endforeach
您正在迭代所有帖子的所有标签,并输出帖子标题。
因此,对于包含3个标签的帖子,您将输出帖子标题3次。
你可能会这样做:
<?php $posts = Digitus\Base\Model\Post::with('Tags.Posts')->get(); ?>
@foreach ($posts as $post)
@foreach ($post->tags as $tag)
@foreach ($tag->posts as $relatedPost)
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">{{ $relatedPost->title }}</div>
@endforeach
@endforeach
@endforeach
未经测试,但据我所知,Eloquent渴望加载如何工作,它应该可以工作。
修改强>
上面会实际输出所有帖子,所以如果你想要一篇帖子的相关帖子,这就是要走的路:
以下内容应输出一个包含单个帖子的数组:
<?php $posts = Digitus\Base\Model\Post::with('tags.posts')->where('id', $id)->get(); ?>
然后您将重复&#39;过:
@foreach ($posts as $post)
@foreach ($post->tags as $tag)
@foreach ($tag->posts as $relatedPost)
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">{{ $relatedPost->title }}</div>
@endforeach
@endforeach
@endforeach
答案 1 :(得分:0)
这样做,但是请记住会运行3个db查询,所以也许你想要一些联接
<?php
// don't do this in the view, better in controller, service or whatever and just pass $posts to the view
$posts = Digitus\Base\Model\Post::with('tags.posts')->get();
?>
@foreach($posts as $parentPost)
@foreach($parentPost->tags as $tag)
@foreach($tag->posts as $post)
<?php if($post->id == $parentPost->id) continue; ?>
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">{{ $post->title }}</div>
@endforeach
@endforeach
@endforeach
-----编辑: 在您的代码模型中,您不会从关系中返回任何内容,因此只需添加return:
public function posts()
{
return $this->belongsToMany('Digitus\Base\Model\Post');
}