嵌套在Eloquent中具有不同关系的地方

时间:2015-08-12 10:35:03

标签: postgresql laravel laravel-5 eloquent

以下是Laravel 5应用程序中Eloquent类之间的一些关系:

  • B属于A
  • B有一个C

使用正确的外键构建表。 以下是A的范围方法:

public function scopeMyScope(Builder $query) 
{
    return $query->whereHas('B.C', function($q) {
        $q->whereRaw("1=1");
    });
}

如果我们调用A::myScope()->get(),则会导致SQL错误,因为laravel构建了此查询:

select * from "a" where (select count(*) from "b" where "a"."a.b_id" = "b"."id" and (select count(*) from "c" where "c"."b_id" = "b"."id" and 1=1) >=1 ) >= 1

错误是:

Illuminate\Database\QueryException with message 'SQLSTATE[42703]: Undefined column: 7 ERROR:  column c.b_id does not exist

因此,构建的查询是错误的,因为没有c.b_id列(因为B hasOne C,因此连接列位于C)。我做错了什么或者是laravel的查询构建器中的错误吗?

1 个答案:

答案 0 :(得分:2)

根据我的理解,你需要做一个嵌套的whereHas,所以:

public function scopeMyScope(Builder $query)
{
    // b is the name of the relationship...
    return $query->whereHas('b', function($q)
    {
         // c is the name of the relationship...
         $q->whereHas('c', function()
         {
             $q->where(1, 1);
         });
    }
}

这会解决您的问题吗?