2016-04-27 49 views
1

由于需要内容本地化,每个可本地化模型的数据被分成2个表格,包含基本和可本地化的字段。所以我加入了代码清除的全局范围。但是现在,如果我试图加入另一个本地化表格,我得到这个错误。Laravel全球范围和多个连接

Undefined table: 7 ERROR: missing FROM-clause entry for table "posts" 

故障码:

$news = Post::orderIdDesc() 
      ->innerJoin('organizations', 'organization','id') 
      ->where('posts.organization', '=', $orgId) 
      ->select('*') 
      ->take(3) 
      ->get(); 

返回此SQL:

select * from "posts_uk" 
    inner join "organizations" on "posts"."organization" = "organizations"."id" 
    inner join "organizations_uk" on "organizations_uk"."id" = "organizations"."id" 
    inner join "posts" on "posts_uk"."id" = "posts"."id" 
where "posts"."organization" = 1 
order by "posts_uk"."id" desc limit 3 

正如你所看到的,Post模型的另一部分在全球范围内加入,附加在查询结束,导致提到的错误。

也许有一些方法可以使全局范围预先在开始时加入,或者任何其他适用的分辨率。

THX

+0

在Laravel 5.3。你到底怎么解决它? – Erin

回答

0

有是把全球范围的开头没有正式的方式,但你可以反向手动加入您的全局范围内。这有点hacky,但应该工作:

public function apply($builder, $model) 
{ 
    $builder->join(...); 
    $builder->join(...); 

    // remove the join clauses from the end of the query 
    $query = $builder->getQuery(); 
    $join2 = array_pop($query->joins); 
    $join1 = array_pop($query->joins); 

    // and merge them back at the beginning 
    $query->joins = array_merge([$join1, $join2], $query->joins); 
} 
0

我升级到Laravel 5.3时有同样的问题。全球范围内的连接是最后一次连接,而不是第一次连接。建立在安泽的回答,我添加的方法:

protected function popShiftLastJoin(Builder $builder) { 
    $query = $builder->getQuery(); 
    $join = array_pop($query->joins); 
    array_unshift($query->joins, $join); 
} 

然后调用后,您范围内的任何连接方法应先加入:我有同样的问题

public function apply(Builder $builder, Model $model) { 
    $builder->join(...); 
    $this->popShiftLastJoin($builder); 
}