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();
使用 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();