【问题标题】: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

标签: php mysql laravel filter relationship


【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 2018-10-10
        • 1970-01-01
        • 2020-06-20
        相关资源
        最近更新 更多