Laravel 范围和连接不遵守关系的 where 语句

Laravel scopes and joins not honoring where statement for relations

使用 Laravel 5 已经有一段时间了,虽然我很喜欢它,但我似乎 运行 喜欢 Eloquent 和查询生成器,这让我抓狂。很长一段时间以来,我一直在努力寻找解决方法,但终究无法解决。

长话短说,我有一个 Artwork 模型属于 Artist 模型;相反,艺术家在 Laravel 5.3 + MySQL.

上有许多艺术作品

艺术品模型和艺术家都有 属性 visible。我需要的是对所有 Artwork 模型的查询 only ever return 结果具有属于 Artist 模型的 Artwork,其中 Artwork 和 Artist 都具有可见值共 1 个

我已经尝试了很多不同的方法,我知道我过去没有遇到过这个问题。通常我会执行基于 Eloquent 的查询,手动查询或在每个模型上使用范围查询。在没有范围的情况下分解我已经这样做了:

$artwork = Artwork::with([ 'artist' => function($query) {
                $query->where('visible', 1);
            }])->where('artworks.visible', 1)->get();

我得到了结果并且没有错误,这太棒了。除了一定比例的结果附加了艺术家模型,其中艺术家的可见 属性 = 0。没有意义。所以我认为这可能是一个 table 命名问题,with where 语句错误地指向了艺术品 table。

试图在 Eloquent 查询上更明确,并将 with/where 更改为:

$query->where('artists.visible', 1);

不喜欢,然后我试着像这样制作一个很好的老式查询构建器查询:

$artwork = DB::table('artworks')
                ->join('artists', function ($join) {
                    $join->on('artists.id', '=', 'artworks.artist_id')->where('artists.visible', '=', 1);
                })
                ->where('artworks.visible', '=', 1)
                ->get(); /// get or paginate or whatever

所以基本上是一样的,但使用了查询生成器。再一次,没有错误,我得到了我的结果。但这与我在 Artist 模型的可见值为 0 时得到的结果是一样的!

我的预感是我犯了一些非常低级的错误,而且我已经关注这个问题太久了以至于没有意识到。看起来很奇怪,我的 with/join 语句似乎被忽略了。有什么想法吗?

编辑答案上下文:

下面的答案很明确,但我链接到这个 post 是为了说明为什么这对 posterity 不起作用。

关于Laravel Eloquent的has() vs where() vs whereHas()

它们之间的差异可能令人困惑,尤其是在接受参数和子查询方面。阅读此内容以获取更多信息:

$artwork = Artwork::whereHas('artist', function ($query) {
        $query->where('visible', 1);
    })
    ->with('artist')
    ->where('visible', 1)
    ->get();

$artwork = DB::table('artworks')
    ->join('artists', 'artists.id', '=', 'artworks.user_id')
    ->where('artists.visible', 1)
    ->where('artworks.visible', 1)
    ->get();

试试这个!!

$results = Artwork::whereHas('artist', function ($q) {
       return $q->where('visible', 1); 
       })
     ->with('artist')
     ->where('visible', 1)
     ->get();