具有特定标签的 Laravel 帖子,但具有特定标签除外

Posted

技术标签:

【中文标题】具有特定标签的 Laravel 帖子,但具有特定标签除外【英文标题】:Laravel Posts that have specific tags and except have specific tags 【发布时间】:2022-01-13 11:04:56 【问题描述】:

我有 2 个模型 => posttag(多对多关系),标签也有 2 种类型,如“趋势”和“限制”

标签模型表 : id - tag_type - tag_title - tag_slug

public function getTags()

    return $this->belongsToMany(Tag::class, 'tags_posts', 'post_id', 'tag_id');

我需要获得以下帖子:当 $request->trending 存在时,返回具有 tag_type == "trending" 和 tag_title == $request->trending Also 的帖子(这是't 有条件且始终检查)除了具有 tag_type == "restrict" 和 tag_slug == "simple2" 的帖子

我需要雄辩的 laravel 而不是 php 数据库,优化很重要

感谢一百万

【问题讨论】:

旁注:关系方法应命名为tags,枢轴应命名为post_tag以遵循约定;那么你只需要 belongsToMany 的 1 个参数 谢谢,名字没问题,他们可以工作 这是什么意思:“当$trending="simple"存在时”?那个变量是从哪里来的? @lagbox - 是的,它是可变的,从请求中获取:$trending = $request->trending; 听起来您正在寻找 whereHaswhereDoesntHave ...它在 Eloquent Relations 文档中,Querying Relationship Existence/Absence 【参考方案1】:

扩展 lagbox 的评论,您正在寻找 whereHas 和 whereDoesntHave,将闭包传递给每个以进行过滤:

Post::whereHas('tags', function($q) use($request)
    if ($request->trending) 
        $q->where('tag_type', $request->trending);
           
)
->whereDoesntHave('tags', function($q)
    $q->where([
        'tag_type' => 'restrict',
        'tag_slug' => 'simple2'
    ]);
);

WhereHas 将只选择带有 tag_type === $request->trending 标签的帖子, WhereDoesntHave 将过滤掉标签为 tag_type === 'restricted' 和 tag_slug === 'simple2' 的帖子。

【讨论】:

以上是关于具有特定标签的 Laravel 帖子,但具有特定标签除外的主要内容,如果未能解决你的问题,请参考以下文章

Laravel从模型中获取具有特定数据和关系的记录

通过 Laravel 集合创建单个数组,但具有特定字段

选择没有特定标签的帖子

使用特定标签在自定义帖子类型和分类中搜索

过滤 CKEditor HTML 属性

检查上一个帖子项目是不是具有特定的 Wordpress 帖子格式