从父级获取过滤的子级

Posted

技术标签:

【中文标题】从父级获取过滤的子级【英文标题】:Get filtered child from parent 【发布时间】:2020-01-14 02:08:29 【问题描述】:

我有一对多的关系。所以我可以使用这段代码来显示所有帖子。

$tag = Tag::where('slug', $slug)->first();
$posts = $tag->posts;

它工作正常,但我想过滤子显示。例如:

$posts = $tag::whereHas('posts', function($query)
$query->where('accept', 1)
)->get();

但它获取的是标签而不是帖子。知道如何解决我的问题吗?

【问题讨论】:

问题出在这里$tag::whereHas应该是Tag::whereHas 【参考方案1】:

正如documentation所提到的:

由于所有关系也用作查询构建器,因此您可以通过调用 cmets 方法并继续将条件链接到查询上来添加更多的约束条件来检索 cmets:

$comment = App\Post::find(1)->comments()->where('title', 'foo')->first();

您可以将代码更改为:

$posts = $tag->posts()->where('accept', 1)->get()

可以直接查询关系。

【讨论】:

【参考方案2】:

在 Post 模型中,您必须像这样定义与标签的关系

public function tags()
    return $this->hasMany(Tag::class);

这就是您可以从特定标签获取帖子的方式

$slug = "my-slug";
$posts = Post::whereHas('tags', function($query) use ($slug)
    $query->where('slug', $slug)
)->where('accept', 1)->get();

【讨论】:

【参考方案3】:

你可以使用

$tag = Tag::where('slug', $slug)
    ->with(['posts' => function($q) 
        $q->where('accept', 1);
    ])->first();
$posts = $tag->posts;

【讨论】:

以上是关于从父级获取过滤的子级的主要内容,如果未能解决你的问题,请参考以下文章

从父级中的子级访问元素标记名

在 useEffect() 钩子中从父级传递的子级调用函数,React

Java MySQL递归子级父级,构建树结构

Java MySQL递归子级父级,构建树结构

如何将函数从父级传递给深层嵌套的子级并将@input 值用于Angular 8中传递的函数?

如何使引导树视图从父级折叠到子级?