2016-04-27 101 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); 
}