Есть две таблицы связанные many to many: communications и units.
Нужно получить все записи из связной таблицы, с записями units по communication.id.
Важно это сделать одним запросом.
Опишу свои шаги
Шаг 1
связь:
Код: Выделить всё
public function getUnits()
{
return $this->hasMany(Unit::className(), ['id' => 'unit_id'])
->viaTable('unit_communications', ['communication_id' => 'id']);
}
Код: Выделить всё
Communication::find()->with(['units'])
->where([Communication::tableName().'.id' => 1])
->one();
Код: Выделить всё
SELECT * FROM "communications" WHERE "communications"."id"='1'
SELECT * FROM "unit_communications" WHERE "communication_id"=1
SELECT * FROM "units" WHERE "id" IN (5, 6, 7, 8)
Заменяем with на joinWith:
Код: Выделить всё
Communication::find()->joinWith(['units'])
->where([Communication::tableName().'.id' => $id])
->one();
В модели Communication прописываем две связи:
Код: Выделить всё
public function getCommunicationUnits()
{
return $this->hasMany(UnitCommunication::className(), ['communication_id' => 'id']);
}
public function getUnits()
{
return $this->hasMany(Unit::className(), ['id' => 'unit_id'])
->via('communicationUnits');
}
Код: Выделить всё
SELECT "communications".* FROM "communications" LEFT JOIN "unit_communications" ON "communications"."id" = "unit_communications"."communication_id" LEFT JOIN "units" ON "unit_communications"."unit_id" = "units"."id" WHERE "communications"."id"='1'
SELECT * FROM "unit_communications" WHERE "communication_id"=1
SELECT * FROM "units" WHERE "id" IN (5, 6, 7, 8)
Шаг 3
заменяем ->one() на ->all(), добавляем поля в select и метод asArray()
Код: Выделить всё
Communication::find()->joinWith(['units'])
->where([Communication::tableName().'.id' => $id])
->select(['serial', 'send_time', 'filter_id']) // поля из связной таблицы
->asArray()
->all()
Код: Выделить всё
SELECT "serial", "send_time", "filter_id" FROM "communications" LEFT JOIN "unit_communications" ON "communications"."id" = "unit_communications"."communication_id" LEFT JOIN "units" ON "unit_communications"."unit_id" = "units"."id" WHERE "communications"."id"='1'
SELECT * FROM "unit_communications" WHERE 0=1
SELECT * FROM "units" WHERE 0=1
Эти запросы формируются в \yii\db\ActiveQuery.populate
Возможно я что-то делаю не так, если что, поправьте.
Заранее спасибо.