Yii2 如何实现Many_Many

YII2 如何实现 yii1的以下代码?


'receiverList'=>array(self::MANY_MANY, 'User', '_general_messagesend_receiver_link(messageSend_id, receiver_id)'),

			'countKnow'=>array(self::STAT,'MessageReceive','messageSendId','condition'=>'isKnow=1'),

1 Like

http://stuff.cebe.cc/yii2docs/guide-db-active-record.html

Relations with Junction Table

1. Yii1 MANY_MANY

Your Yii1 code:

'receiverList' => array(
    self::MANY_MANY,
    'User',
    '_general_messagesend_receiver_link(messageSend_id, receiver_id)'
),

In Yii2, use hasMany() with viaTable():

public function getReceiverList()
{
    return $this->hasMany(User::class, ['id' => 'receiver_id'])
        ->viaTable('_general_messagesend_receiver_link', ['messageSend_id' => 'id']);
}

Then you can access it like:

$messageSend->receiverList

Or:

$messageSend->getReceiverList()->all();

2. Yii1 STAT

Your Yii1 code:

'countKnow' => array(
    self::STAT,
    'MessageReceive',
    'messageSendId',
    'condition' => 'isKnow=1'
),

In Yii2, you can create a relation and count it:

public function getMessageReceives()
{
    return $this->hasMany(MessageReceive::class, ['messageSendId' => 'id']);
}

public function getCountKnow()
{
    return $this->getMessageReceives()
        ->andWhere(['isKnow' => 1])
        ->count();
}

Then:

$count = $messageSend->countKnow;

So the Yii1 → Yii2 equivalent is generally:

Yii1 MANY_MANY  →  Yii2 hasMany() + viaTable()
Yii1 STAT       →  Yii2 hasMany() + count()