Search code examples
phpmany-to-manyyii2

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)?


Solution

  • 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