【问题标题】:Returning all Laravel eloquent models tagged with a specific set of tags返回所有带有特定标签集的 Laravel eloquent 模型
【发布时间】:2015-10-06 04:50:52
【问题描述】:

我有一个 Eloquent 模型 PostbelongsToMany(Tag::class) 关系。现在,在我想返回或获取所有带有给定标签集的帖子的情况下,执行此类查询的最有效的 Laravel-esq 方式是什么?

例如;获取所有带有标签bbq 的帖子,或所有带有标签bbqbeef 的帖子。

我想简单地传递一个标签数组,如果可能的话,可以在其中任意计数。我已经尝试了以下几种不同的组合,但都没有运气,因为我的 SQL 功夫不是最好的。

$posts = Post::whereHas('tags', function ($query) {
    $query->whereIn('tag_types.name', ['bbq', 'beef']);
})->get();

【问题讨论】:

    标签: php laravel-5 eloquent pivot-table


    【解决方案1】:

    终于找到了解决办法。在这种情况下,它需要知道相关标签的 ID,这很容易查询。在这种情况下,我将标签 ID 存储在一个名为 $tag_ids 的数组中,并使用以下 Eloquent 查询(tag_types 是数据透视表):

    $posts = Post::join('tag_types', function ($join) use ($tag_ids) {
        $join
            ->on('posts.id', '=', 'tag_types.post_id')
            ->whereIn('tag_types.tag_id', $tag_ids);
    })
        ->groupBy('posts.id')
        ->havingRaw('count(distinct tag_types.tag_id) = ' . count($tag_ids))
        ->lists('post_id');
    

    $posts 现在包含包含$tag_ids 中列出的每个标签 ID 的所有帖子的 ID。

    希望这可以帮助任何面临类似困境的人。

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      相关资源
      最近更新 更多