从父级获取筛选后的子级。

3
我有一个一对多的关系。因此,我可以使用以下代码显示所有帖子。
$tag = Tag::where('slug', $slug)->first();
$posts = $tag->posts;

它可以正常工作,但我想要过滤子元素进行显示。例如:

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

但它获取的是标签而不是文章。有什么办法可以解决我的问题吗?

问题出在这里 $tag::whereHas 应该是 Tag::whereHas - Ayaz Ali Shah
3个回答

3
在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();

1

文档所述:

由于所有关系也充当查询构建器,因此您可以通过调用评论方法并继续在查询中链接条件来添加进一步的约束条件以检索评论:

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

您可以将您的代码更改为:

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

你可以直接查询关系。

0

您可以使用

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接