如何在Yii2中使用join和indexBy?

时间:2015-09-29 21:46:35

标签: join activerecord yii2

我有这个,但它分别加载每个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中的表并使用连接表中的值进行索引?

2 个答案:

答案 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;
}