【问题标题】:How do I use join and indexBy in Yii2?如何在 Yii2 中使用 join 和 indexBy?
【发布时间】:2015-09-29 21:46:34
【问题描述】:

我有这个,但它会单独加载每一行 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 中连接一个表并按连接表中的值进行索引?

【问题讨论】:

  • 你有 Product::getEbay() 方法吗?

标签: join activerecord yii2


【解决方案1】:

indexBy 无法做到这一点。但是,ArrayHelper::index 可以索引相关模型字段上的数组。所以这里是如何做到的:

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

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

代码将运行两个查询,一个获取所有产品,一个获取所有相关的 ebay 产品。然后该数组将被索引,根本不需要数据库查询。

【讨论】:

  • 哇,成功了!我不知道那存在。我喜欢学习新事物!不得不使用$products = \yii\helpers\ArrayHelper::index($products, 'ebay.epid');
【解决方案2】:

我最终为一部分 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多