【问题标题】:Laravel get posts with multiple tagsLaravel 获取带有多个标签的帖子
【发布时间】:2015-06-16 16:13:17
【问题描述】:

我正在处理 PostTag 之间的 laravel belongsToMany 关系。

我想要做的是获取所有Posts,它有多个标签。

我尝试了各种雄辩的查询,但我根本无法得到它。

目前我可以获得post_idtag_id 的数组,如下所示,但必须有更简单的方法来做到这一点。

if (Request::has('tags')) {
    $tags = Tag::find(explode(',', Request::get('tags')));
}else{
    $tags = null;
}
// Get all posts tagged with the tags
$jobs = \DB::table('post_tag');
foreach ($tags as $tag) {
    $posts = $posts->orwhere('tag_id', $tag->id);
}
dd($posts->get());

这会转储具有任何 ID 的所有帖子的数组,但我需要获得一个包含所有 tag_ids 的 post_ids 数组。

提前致谢!

【问题讨论】:

    标签: php sql-server laravel eloquent


    【解决方案1】:

    最好在Post 模型上使用whereHas() 来预先加载标签并仅获取至少具有这些标签之一的Posts。

    $posts = Post::whereHas('tags', function($q) use ($tags)
    {
        $q->whereIn('id', $tags);
    })->get();
    

    这里,$tags 只是一个标签 ID 的数组。 $posts 将是 CollectionPosts。要从中获取 id 数组,您可以简单地这样做...

    $ids = $posts->lists('id'); 
    

    或者,不是最初调用get(),而是使用...->lists('id')

    编辑

    如果您只寻找那些包含所有标签的Posts,您希望将一些附加参数传递给whereHas 函数。

    $posts = Post::whereHas('tags', function($q) use ($tags)
    {
        $q->whereIn('id', $tags);
    }, '=', count($tags))->get();
    

    将会发生的情况是它只会抓取附加的标签数量等于标签数组中标签数量的帖子。

    如果您使用这种方法,请确保您的数据透视表得到正确管理,因为不能多次将某个标签附加到某个模型。

    【讨论】:

    • 感谢您的建议。关于如何获取包含$tags 中所有标签的帖子的任何想法?您的想法非常适合获取至少具有一个标签的所有帖子。我应该遍历每个tag_id 并缩小查询范围吗?此时我只想让它工作,但我认为有一种相对简单的 laravel 方法可以做到这一点。
    • 是的,有一个很好的方法可以做到这一点,whereHas 需要一些额外的参数来处理这件事,我会更新我的答案。
    • 太棒了!非常感谢!您更新的答案正是我所需要的。我已经尽可能地遵循 laravel 标准,所以我正确地附加和同步了标签。再次感谢!
    • 我通常在数据透视表中的tag_idpost_id 列上放置一个复合主键,以便100% 确保这些列上永远不会发生重复。也可以使用唯一键来完成。
    • SQL Server 早于 2008 年无法使用 eloquent 正确同步数据透视表(不支持多个插入语句),因此我必须手动分离所有标签并重新附加它们,所以没有重复发生。不过感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2014-11-02
    • 2021-01-30
    • 2015-12-27
    • 2021-08-23
    相关资源
    最近更新 更多