2016-08-04 23 views
2

Ich habe eine Tabelle mit dem Namen Locins (Standorte), die einen Fremdschlüssel zu einer anderen Tabelle namens Rgn (Regionen) hat.belongsTo Relation null

Also in meinem LocIn Modell:

class Locin extends Model 
{ 
    protected $table = 'Locin'; 

    protected $primaryKey = 'Locin_id'; 

    public $timestamps = false; 

    public function Rgn() 
    { 
     return $this->belongsTo('App\Models\Rgn', 'RgnID', 'RgnID'); 
    } 
} 

und in meinem Rgn Modell:

class Rgn extends Model 
{ 
    protected $table = 'Rgns'; 

    protected $primaryKey = 'RgnID'; 

    public $timestamps = false; 

    public function Locin() 
    { 
     return $this->hasOne('App\Models\Locin', 'RgnID', 'RgnID'); 
    } 

} 

Wenn ich sage: $location = Locin::find($request->Locin); ein Standort erfolgreich zurückgegeben wird. (Ich habe es var_dumped).

Aber dann, wenn ich $location->Rgn sage, gibt es null zurück.

Tische Struktur:

Locins Tabelle: [Locin_id (Primärschlüssel), RgnID (Fremdschlüssel), andere, nicht verwandte Felder].

Rgns Tabelle: [RgnID (Primärschlüssel), andere nicht verwandte Felder]

Was mache ich falsch?

bearbeiten Es stellt sich heraus, dass der dumme Samen in der DB einen Fremdschlüssel für einen Eintrag hatte, der nicht existiert. Ich bin es leid, auf albernen Dingen stecken zu bleiben. Entschuldigung und einen schönen Tag.

+0

Ihre Tabelle Locin hat die RgnID-Spalte und einen Datensatz mit einer vorhandenen RgnID? –

+0

meine Locin-Tabelle hat viele Datensätze mit vorhandenen RgnIDs und die besondere, die ich auf sicher bin, hat eine RgnID von Wert 35. –

+0

Liefert 'Rgn :: finden ($ location-> RgnID)' einen 'Rgn' Datensatz zurückgeben, oder Null? – patricus

Antwort

1

Sie können sehen, was die Abfrage für die Region läuft, es ist eine Möglichkeit, Prüfprozesse:

\DB::connection()->enableQueryLog(); 
$location = Locin::find(1); 

$region = $location->Rgn; 

$query = \DB::getQueryLog(); 
$lastQuery = end($query); 

dd($lastQuery); 

Sie erhalten so etwas wie dieses

array:3 [ 
    "query" => "select * from `Rgns` where `Rgns`.`RgnID` = ? limit 1" 
    "bindings" => array:1 [▼ 
     0 => 1 
    ] 
    "time" => 0.5 
] 

Und ersetzen Sie den Wert bindings in der Abfrage können Sie die Ausgabe direkt t ausführen o Ihre Datenbank, um zu sehen, ob die Abfrage richtig ist

Select * from `Rgns` where `Rgns`.`RgnID` = 1 limit 1 
+0

Vielen Dank! das klingt sehr nützlich. Aus irgendeinem Grund gibt es zurück: ' Array: 3 [▼ " Abfrage "=>" wählen * aus 'Rgns' wo' Rgns'.RgnID' =? Limit 1 " " Bindings "=> Array: 1 [▼ 0 => 0 ] "Zeit" => 3.19 ] ' Also ein' '' als RgnID. –

+1

@AdamZahran Das '?' Ist ein Parameter-Platzhalter. 'Bindungen' sagen Ihnen, welche Werte in diese Parameter injiziert werden. In dem von Alfredo gegebenen Beispiel zeigen die "Bindungen", dass der Wert "1" injiziert würde. In der Ausgabe, die Sie gezeigt haben, wird der Wert "0" eingegeben. Dies bedeutet, dass die 'Locins.RgnID' des von Ihnen getesteten Datensatzes 0 ist. – patricus

+0

Ihr wart sehr hilfsbereit. Vielen Dank. –

0

Sie haben beide Beziehungsspalten für jede Beziehung auf 'RgnID' gesetzt. Ich vermute, es sollte etwas anderes sein.

Denken Sie daran, es ist:

return $this->belongsTo('App\Whatever', 'foreign_key', 'other_key'); 
+0

In 'Locin' gibt es ein Feld namens RgnID, das auf den Primärschlüssel in der Rgns-Tabelle verweist, der auch RgnID heißt. Ich wünschte, du hättest recht, aber das ist nicht der Fall. –

+1

Ich hoffe, dass dies nicht unhöflich wirkt, denn das ist definitiv nicht meine Absicht, aber wenn Sie die Kontrolle über das Schema haben und das ist etwas Neues, das Sie aufbauen, lohnt es sich, den richtigen Namenskonventionen zu folgen. Benennen Sie Ihre Modelle 'Location' und' Region', Primärschlüssel sollten 'id' genannt werden und Fremdschlüssel in Ihrer' locations' Tabelle sollte 'region_id' sein. Dann müssen Sie sich um nichts kümmern, Sie brauchen nur den Modellnamen. – user3158900

+0

Ich verstehe, woher du kommst. Ich habe tatsächlich das gleiche Gefühl über all das, aber leider ist dies ein bereits existierendes Projekt, an dem ich arbeite, und ich muss mich an die vordefinierte Datenbankbenennung halten. –

0

Wenn Sie die Region durch das Standortmodell zu holen, dann sollten Sie den eifrig Laden verwenden (https://laravel.com/docs/5.2/eloquent-relationships#eager-loading) des zugehörigen Modells mithilfe diesen

$location = Locin::where('Locin_id', $request->Locin)->with('Rgn')->get(); 

Hoffe das hilft Ihnen, eine sehr schnelle Lösung zu finden.