Laravel的范围和加入并不尊重关系的声明

时间:2017-05-26 23:17:20

标签: php mysql laravel laravel-5 laravel-5.3

现在已经使用Laravel 5很长一段时间了,虽然我喜欢它,但是我似乎遇到了Eloquent和Query构建器这个偶然的问题让我疯狂。我一直试图找到解决方法很长一段时间,并且无法弄清楚我的生活。

长话短说我有一个属于艺术家模型的艺术作品模型;相反,艺术家在Laravel 5.3 + MySQL上有很多艺术作品。

艺术品模型和艺术家都有一个属性visible。我需要的是对所有艺术品模型的查询返回的结果具有属于艺术家模型的艺术品,其中艺术品和艺术家的可见值均为1。

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

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

我得到的结果没有错误,这很好。除了一定比例的结果附有Artist模型,其中Artist的visible属性= 0.没有意义。所以我想也许这是一个表命名的东西,而where语句错误地指向了艺术品表。

试图在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

所以与查询构建器基本相同。再一次,没有错误,我得到我的结果。但是我得到的结果是艺术家模型的可见值为0!

我的暗示是我犯了一些非常基本的错误,而且我一直在看这个问题太长时间才能意识到。看起来很奇怪,我似乎对我的with / join语句被忽略了。有什么想法吗?

编辑答案上下文:

下面的答案已经确定了,但我正在链接到这篇文章,以说明为什么这不适用于后代。

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

这些之间存在差异,这可能令人困惑,尤其是在接受参数和子查询方面。阅读本文以获取更多信息:Laravel - Eloquent "Has", "With", "WhereHas" - What do they mean?

2 个答案:

答案 0 :(得分:1)

$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();

答案 1 :(得分:1)

试试这个!!



app/AppKernel.php