Я работаю с Yii Framework 2.0 и имею две таблицы базы данных (A и B). Это реляционная база данных 1: n. A имеет только один B, но B имеет много A. Моя база данных выглядит примерно так.
A table:
id = 1, name = yes
id = 2, name = no
id = 3, name = ok
id = 4, name = good
B table:
id = 1, a_id = 1
id = 2, a_id = 1
id = 3, a_id = 2
id = 4, a_id = 2
id = 5, a_id = 3
В моем контроллере я использую следующий код для извлечения всех данных A и B:
$bModel = B::find()->all();
На мой взгляд, я использую следующее for-each для отображения всех данных.
foreach($bModel as $b) {
echo $b->a->name . ' - ' $b->id. '<br>;
}
Результат:
yes - 1
yes - 2
no - 3
no - 4
Что я хочу это:
yes - 1
2
no - 3
4
Я хочу объединить a_id и показать все идентификаторы b каждого слитого a_id. Я не хочу использовать обычный способ: сначала получить все идентификаторы a, использовать for-each, чтобы зациклить id каждого a, а затем запросить b один за другим по идентификатору a. Как я могу приблизиться ко второму результату, как я хотел с Yii Framework 2.0?
Вы можете использовать метод joinWith () для активной загрузки связанных моделей. Eager Загрузка извлечет все отношения B одним запросом, так что вы не будете запрашивать базу данных каждый раз в цикле. Во-первых, убедитесь, что у вас есть это отношение, определенное в модели A:
/**
* @return \yii\db\ActiveQuery
*/
public function getBs()
{
return $this->hasMany(A::className(), ['a_id' => 'id']);
}
Затем выполните запрос всех записей вместе, используя метод joinWith ():
foreach (A::find()->joinWith('bs')->all() as $a){
echo $a->name."\n<br />\n";
foreach ($a->bs as $relatedB){
echo $relatedB->name.' - '.$relatedB->id."\n<br />\n";
}
echo "\n<br />\n";
}
По умолчанию для joinWith () установлено значение Eager Загрузка объединенных моделей с использованием LEFT JOIN. Если вы запустите этот запрос и включите ведение журнала базы данных, вы должны увидеть только один запрос для выборки моделей A и один запрос для выборки моделей B.
Подробнее о вступлении в отношения: http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#joining-with-relations
Других решений пока нет …