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

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();

На мой взгляд, я использую следующие для каждого, чтобы отразить все данные.

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?

Теги:
yii2
relational-database
yii
one-to-many

1 ответ

1

Вы можете использовать метод 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

  • 0
    В случае, если в таблице A есть id = 3, но в таблице B нет NO a_id = 3, и я хочу запросить только записи A, для которых B имеет a_id в качестве внешнего ключа. Как я могу это сделать?
  • 0
    Я думаю, что вы описываете это внутреннее соединение. В этом случае попробуйте изменить код в цикле foreach с A::find()->joinWith('bs')->all() на A::find()->innerJoinWith('bs')->all()
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню