2014-11-06 2 views
0

Я работаю с Yii framework 2.0 и имею две таблицы базы данных (A и B). Это реляционная база данных 1: n. A имеет только один B, но B имеет множество A. Моя база данных похожа на эту.Yii Framework 2.0 Реляционная база данных Active Record

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 

В моем контроллере я использую следующий код, чтобы получить все данные А и В:

$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 и показать все идентификатор Б каждого присоединяемого A_ID. Я не хочу использовать обычный способ, прежде всего, получить все id, использовать for-each, чтобы зацикливать каждый идентификатор a, а затем запросить b один за другим по id. Как я могу подойти ко второму результату, как я хотел с Yii framework 2.0?

ответ

1

Вы можете использовать метод joinWith() для активной загрузки связанных моделей. Eager Loading будет извлекать все отношения B с одним запросом, чтобы вы не запрашивали базу данных каждый раз в цикле. Во-первых, убедитесь, что вы это отношение, определенное в модели А:

/** 
* @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() по умолчанию для жадной загрузки объединенных моделей с использованием LEFT JOIN. Если вы запустите этот запрос и включите ведение журнала базы данных, вы должны увидеть только один запрос для извлечения моделей A и одного запроса для извлечения моделей B.

Подробнее о присоединении с отношениями: http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#joining-with-relations

+0

В случае, если есть идентификатор = 3 в таблице, но никакие a_id = 3 в таблице B, и я хочу, чтобы запросить только записи А, В имеет это a_id как иностранный ключ. Как я могу это сделать? –

+0

Я думаю, что вы описываете Inner Join. В этом случае попробуйте изменить код в цикле foreach из 'A :: find() -> joinWith ('bs') -> all()' to 'A :: find() -> innerJoinWith ('bs') -> all() ' – Caleb

+0

Он отлично работает. Спасибо за это. К сожалению, мне также нужно использовать виджет для разбивки на страницы. Поэтому я использовал последний код следующим образом: A :: find() -> innerJoinWith ('bs'); И мой код разбиения на страницы выглядит следующим образом: $ pagination = new Pagination ([ 'defaultPageSize' => 2, 'totalCount' => A-> count(), ]); $ allA = A-> offset ($ pagination-> offset) -> limit ($ pagination-> limit) -> all(); –

Смежные вопросы