繁体   English   中英

Laravel中的反向模型关系

[英]Reverse model relationships in Laravel

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

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

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

在此代码中:

@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

未经测试,但据我了解,雄辩的紧急加载是如何工作的,它应该可以工作。

编辑:

上面的内容实际上会输出所有帖子,因此,如果要单个帖子的相关帖子,这是一种方法:

以下应该输出其中包含单个帖子的数组:

<?php $posts = Digitus\Base\Model\Post::with('tags.posts')->where('id', $id)->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

可以,但是请注意,将运行3个数据库查询,所以也许您想要一些联接

<?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

-----编辑:在您的Tag模型中,您不会从关联中返回任何内容,因此只需添加return即可:

public function posts()
{
   return $this->belongsToMany('Digitus\Base\Model\Post');
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM