Laravel中的逆向模型关系

时间:2014-04-10 13:33:41

标签: php model laravel relationship

我正在尝试根据帖子获取帖子的相关帖子。

我的帖子(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次以上),但这也失败了。

我不是在寻找直接的答案,更多的是寻找方向和建议等。

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');
}