2014-11-05 8 views
31

Ad esempio, in uno-a-molti a causa di documentazione (http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#relational-data) è possibile collegare due modelli in questo modo (one-many = company-zone):Come faccio a lavorare con molti-a-molti rapporti in Yii2

$defaultZone = new Zone; 
$defaultZone->name = Zone::DEFAULT_ZONE; 
$company->link('zones', $defaultZone); 

Ma come funziona per le relazioni molti-a-molti quando hai una tabella di transito come tbl_user_market(user_id, market_id)?

risposta

66

Quando si utilizza una tabella di giunzione per molti-a-molti rapporti, bisogna

  1. Definire i rapporti
  2. collegare i due modelli insieme

Nel modello User definire il seguito funzione di relazione:

public function getMarkets() { 
    return $this->hasMany(Market::className(), ['id' => 'market_id']) 
     ->viaTable('tbl_user_market', ['user_id' => 'id']); 
} 

Nel modello Mercato, definire la seguente r funzione di esaltazione:

public function getUsers() { 
    return $this->hasMany(User::className(), ['id' => 'user_id']) 
     ->viaTable('tbl_user_market', ['market_id' => 'id']); 
} 

E infine, dopo aver salvato entrambi i modelli, collegarli tra loro:

$user = new User; 
$user->name = 'Foo'; 
$user->save(); 

$market = new Market; 
$market->name = 'Bar'; 
$market->save(); 

$user->link('markets', $market); 

La chiamata alla link() popolerà tabella di collegamento.

Riferimento: http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#link()-detail

+0

oh sì, hai ragione! grazie – raiym

+3

come fare questo per l'aggiornamento? – onegun

+0

@onegun: quando si chiama save() su un modello, Yii determina se eseguire un aggiornamento o inserire una query. Questa è la bellezza di un tale quadro, non devi più preoccuparti di cose del genere. – vim