具有特定标签的 Laravel 帖子,但具有特定标签除外
Posted
技术标签:
【中文标题】具有特定标签的 Laravel 帖子,但具有特定标签除外【英文标题】:Laravel Posts that have specific tags and except have specific tags 【发布时间】:2022-01-13 11:04:56 【问题描述】:我有 2 个模型 => post 和 tag(多对多关系),标签也有 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;
听起来您正在寻找 whereHas
和 whereDoesntHave
...它在 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 帖子,但具有特定标签除外的主要内容,如果未能解决你的问题,请参考以下文章