2015-09-29 2 views
2

у меня есть, но он загружает каждую ebay строки по отдельности, создавая тысячи заявлений SQL:Как использовать join и indexBy в Yii2?

$products = \app\models\Product::find() 
    ->joinWith('ebay', false, 'inner join') 
    ->indexBy(function($row){return $row->ebay->epid;}) 
    ->all(); 

Я попытался это, но он дал ошибку: 'Getting unknown property: app\models\Product::ebay.epid'

$products = \app\models\Product::find() 
    ->joinWith('ebay', false, 'inner join') 
    ->indexBy('ebay.epid') 
    ->all(); 

Настройку Нежелательная загрузка = true тоже не помогает. Он по-прежнему загружает каждую строку отдельно, а затем загружает их снова в конце.

Как можно эффективно присоединиться к таблице в Yii и указать значение в объединенной таблице?

+0

У вас есть продукт :: getEbay() метод? – robsch

ответ

4

Вы не сможете сделать этого с помощью indexBy. Однако ArrayHelper::index может индексировать массив в соответствующем поле модели. Так вот как это можно сделать:

$products = \app\models\Product::find() 
    ->with('ebay') 
    ->all(); 

ArrayHelper::index($products, 'ebay.epid'); 

код будет работать два запроса, один, чтобы получить все продукты, один, чтобы получить все связанные продукты eBay. Затем массив будет индексироваться без запросов БД.

+1

Ничего себе, это сработало! Я не знал, что это было. Мне нравится узнать о новых вещах! Пришлось использовать '$ products = \ yii \ helpers \ ArrayHelper :: index ($ products, 'ebay.epid');' – Chloe

0

Я закончил делать это вручную для подмножества идентификаторов, и он использует только 2 запроса. Меня все равно интересовал бы indexBy.

$products = Product::find()->joinWith('ebay', true, 'inner join')->where(['ebay.epid' => $productIds])->all(); 
$ebayProducts = array(); 
foreach ($products as $p) { 
    $ebayProducts[$p->ebay->epid] = $p; 
}