我有这个,但它单独加载每个 ebay
行,生成数千条 SQL 语句:
$products = \app\models\Product::find()
->joinWith('ebay', false, 'inner join')
->indexBy(function($row){return $row->ebay->epid;})
->all();
我尝试了此操作,但出现错误:'获取未知属性:app\models\Product::ebay.epid'
$products = \app\models\Product::find()
->joinWith('ebay', false, 'inner join')
->indexBy('ebay.epid')
->all();
设置急切加载= true
也没有帮助。它仍然单独加载每一行,然后在最后再次加载它们。
如何高效连接 Yii 中的表并按连接表中的值建立索引?
最佳答案
您将无法使用indexBy
来做到这一点。但是,ArrayHelper::index 可以在相关模型字段上索引数组。因此,可以这样做:
$products = \app\models\Product::find()
->with('ebay')
->all();
ArrayHelper::index($products, 'ebay.epid');
该代码将运行两个查询,一个用于获取所有产品,一个用于获取所有相关的 eBay 产品。然后该数组将被索引,根本不需要数据库查询。
关于join - 如何在 Yii2 中使用 join 和 indexBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32854318/