Я работаю с 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();
На мой взгляд, я использую следующие для каждого, чтобы отразить все данные.
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 id каждого объединенного a_id. Я не хочу использовать обычный способ, прежде всего, получить все id, использовать for-each, чтобы зацикливать каждый идентификатор, а затем запросить b один за другим по id. Как я могу подойти ко второму результату, как я хотел с Yii framework 2.0?
Вы можете использовать метод joinWith() для активной загрузки связанных моделей. Eager Loading будет извлекать все отношения 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
A::find()->joinWith('bs')->all()
наA::find()->innerJoinWith('bs')->all()