Активная запись реляционной базы данных Yii Framework 2.0

Я работаю с 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?

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]