2016-04-27 8 views
1

Aufgrund der Notwendigkeit der Inhaltslokalisierung werden die Daten jedes lokalisierbaren Modells in zwei Tabellen aufgeteilt, mit Basis- und lokalisierbaren Feldern. Also fügte ich einen globalen Bereich mit Join für Code Cleaness hinzu. Aber jetzt, wenn ich versuche, einer anderen lokalisierten Tabelle beizutreten, erhalte ich diesen Fehler.Laravel globale Gültigkeitsbereiche und multiple Joins

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

Fehlercode:

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

gibt diese 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 

Wie Sie, anderer Teil der Post Modells verbunden im globalen Bereich sehen können, hängt am Ende der Abfrage , verursacht erwähnten Fehler.

Vielleicht gibt es eine Möglichkeit, den globalen Gültigkeitsbereich so anzupassen, dass er am Anfang oder bei jeder anderen geeigneten Lösung hinzugefügt werden kann.

Thx

+0

Ich habe das gleiche Problem in Laravel 5.3. Wie hast du es am Ende gelöst? – Erin

Antwort

0

Es gibt keinen offiziellen Weg, um die globalen Bereiche am Anfang zu setzen, aber man konnte umkehren die manuell in Ihrem globalen Bereich verbindet. Es ist ein bisschen hacky aber sollte funktionieren:

0

Ich hatte das gleiche Problem beim Upgrade auf Laravel 5.3. Der Join in meinem globalen Bereich war der letzte Join anstelle des ersten Joins. Anze Antwort Aufbauend auf, habe ich die Methode:

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

Dann rufen Sie die Methode nach jedem in Ihrem Umfang teilnehmen, die zuerst miteinander verbunden werden sollen:

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