2017-01-04 1 views
1

I Datenbanktabellen wie diese:Laravel erhalten Eloquent Beziehung mit gleichen Namen wie sein Attribut

shoot: id, name, programme 
programme: id, name 

Die eloquente Beziehung im Sproß ist wie folgt definiert:

public function programme() { 
    return $this->belongsTo('App\Programme', 'programme', 'id'); 
} 

Wenn dd() verwenden, I kann das sehen funktioniert das:

dd(Shoot:where('id','=',1)->with('programme')->first()); 
// prints the object with programme listed under the relationship 

Allerdings wenn ich eifrig lade E schieße und versuche, das Programmobjekt zu bekommen, erhalte ich stattdessen das Shoot-Attribut "Programm". Z.B .:

$shoot = Shoot:where('id','=',1)->with('programme')->first(); 
echo $shoot->programme; // returns 1, not App\Programme object. 

Gibt es eine Lösung für dieses Problem ohne Massen der Codebasis neu zu schreiben?

+1

Dies liegt daran, dass Ihre Beziehung den gleichen Namen wie eines Ihrer Attribute hat. Es gibt stattdessen Ihr Attribut zurück. – devk

+0

Halten Sie sich an die Namenskonventionen 'programme' -' programme_id' und Sie sollten gut gehen ... Was ist Programm überhaupt? Verwenden Sie Englisch während der Codierung. (google markiert es als falsch buchstabiertes Wort) – Kyslik

+0

Es ist "richtiges Englisch";) - britische englische Rechtschreibung des Programms, z. ein Fernsehprogramm. Programm in britischem Englisch bezieht sich auf Softwareprogramme explizit. – kirgy

Antwort

3

Sie sollten nicht den gleichen Namen für den Namen sowohl relationship und column verwenden, sonst werden Sie erhalten immer die column Name so versuchen, einen von ihnen zu bearbeiten, ich denke, die einfachste ist hier der relationship Name:

public function programmeObj() { 
    return $this->belongsTo('App\Programme', 'programme', 'id'); 
} 

Dann rufen Sie es wie:

echo $shoot->programmeObj; 

HINWEIS: Aber wenn man Konventionen folgen wollen, sollten Sie den Namen Attribut durchersetzenso:

public function programme() { 
    return $this->belongsTo('App\Programme', 'programme_id', 'id'); 
} 

Hoffe, das hilft.

+1

Ich wollte vermeiden, jeden Bezug auf Attribute im gesamten Code umzubenennen, da die Codebasis in diesem Stadium riesig ist. Ich entschied jedoch, dass dies die beste Option wäre. Es ist gut zu wissen, dass eine einfache Problemumgehung darin besteht, die Modellfunktion einfach umzubenennen. – kirgy

1

Dieser Wille gibt immer die Spalte in Ihrer Datenbank, wenn es vorhanden ist, ist das ID 1.

Wenn Sie anrufen dump($shoot); sollten Sie das Array mit allen Attributen erhalten. Aber wenn Sie führen die folgenden Sie den Namen bekommen sollte:

Ihr Modell:

public function programmeData() { 
    return $this->belongsTo('App\Programme', 'programme', 'id'); 
} 

Und Ihre Controller:

$shoot = Shoot:where('id','=',1)->first(); 
return $shoot->programmeData->name; // returns name 

Hope this funktioniert!

+0

Dies funktioniert nicht für mich, ruft dd ($ shoot-> programmeData) - gibt "null" zurück. UPDATE - Entschuldigung missverstanden das Modell ändert, das ist eine gute Arbeit für jetzt - danke! – kirgy

+0

Was hast du verändert? –

+0

@kirgy schön, eine andere Lösung ist es, die Spalte 'shoot -> programme' in' programma_id' zu ändern.Dann kannst du die andere Antwort von Zakaria verwenden. –

Verwandte Themen