我有这个,但它分别加载每个ebay
行,生成数千条SQL语句:
$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 :(得分:4)
您无法使用indexBy
进行此操作。但是,ArrayHelper::index
可以索引相关模型字段上的数组。所以,这是如何做到的:
$products = \app\models\Product::find()
->with('ebay')
->all();
ArrayHelper::index($products, 'ebay.epid');
代码将运行两个查询,一个用于获取所有产品,一个用于获取所有相关的ebay产品。然后,数组将被索引,根本没有数据库查询。
答案 1 :(得分:0)
我最终手动为id的子集做了它,它只使用了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;
}