Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I work with many-to-many relations in Yii2

For example in one-to-many due to documentation (http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#relational-data) you can link two models in this way (one-many = company-zone):

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

But how it works for many-to-many relations when you have transit table like tbl_user_market(user_id, market_id)?

like image 915
raiym Avatar asked Nov 05 '14 17:11

raiym


1 Answers

When using a junction table for many-to-many relations, you have to

  1. Define the relations
  2. Link the two models together

In the User model define the following relation function:

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

In the Market model define the following relation function:

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

And finally, after saving both models, link them together:

$user = new User; $user->name = 'Foo'; $user->save();  $market = new Market; $market->name = 'Bar'; $market->save();  $user->link('markets', $market); 

The call to link() will populate the junction table.

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

like image 87
vim Avatar answered Oct 05 '22 17:10

vim