2016-04-27 8 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

私は同じ問題を持っている:

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

が続いて最初に参加する必要がありますいずれかがあなたのスコープに参加した後にメソッドを呼び出します。Anzeの答えに構築する、私は方法を追加しました。結局それをどうやって解決しましたか? – Erin

答えて

0

あり初めにグローバルスコープを配置する公式な方法はありませんが、あなたはグローバルスコープ内で手動で合流逆転できます。ちょっとハッキリですが、うまくいくはずです。

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にアップグレードするときに同じ問題が発生しました。グローバルスコープの結合は、最初の結合ではなく最後の結合でした。 Laravel 5.3に

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