2017-10-28 8 views
0

Hier ist das Szenario:Yii2 hasMany Beziehung mit derselben Tabelle

Ich habe zwei Tabellen:

family: id, name 
person: id, name, familyId 

Der Fremdschlüssel auf Person ist (FamilyID -> family.id)

In meinem Personenmodell Ich möchte eine Beziehung haben, die alle Personeneinträge enthalten kann, die dieselbe familyId wie die aktuelle Person haben.

Im Wesentlichen möchte ich $person = Person::find([...])->with('family')->all() machen, um das aktuelle Personenmodell zu erhalten, einschließlich eines Arrays von Familienmitgliedern.

Bisher habe ich diese auf PersonModel:

public function getFamilyMembers() 
{ 
    return $this->hasMany(Person::className(), ['familyId' => 'familyId']); 
} 

...

$person = Person::find() 
      ->with('familyMembers') 
      ->where(['id'=>1]); 
foreach($person->family as $m) { 
    var_dump($m); 
} 

Ich weiß, dass ich diese Tabelle mit einer Kreuzung tun könnte. Aber da es eine 1: n-Beziehung ist, möchte ich die zusätzliche Tabelle vermeiden.

Danke.

Antwort

0

Die schnelle Entscheidung ist so etwas wie diese Abfrage in Ihrer Person Modell:

public function getRelatedPersons() 
{ 
    return self::find()->jeftJoin(Family::tableName(), 'person.familyId = 
    family.id')->where(['person.familyId' => $this->familyId])->all(); 
} 
... 
foreach($personModel->relatedPersons as $person) { 
    var_dunp($preson); 
} 
Verwandte Themen