在 Yii2 中,查询一个列表时,当 type=5 时,才需要基于 value 关联上 image 模型,如何避免 in 中的 value 多余?
1、现有的实现如下
$informations = ConventionCustomerServiceInformation::find()->select('id, group_id, type, label, value')->where([ 'convention_id' => $conventionId, ])->with(['image'])->orderBy('order_number ASC')->asArray()->all(); public function getImage(): ActiveQuery { return $this->hasOne(Image::class, ['id' => 'value']); }
2、生成的 SQL 如下
SELECT * FROM `images` WHERE `id` IN ('7777', '55550', '333', '66', '地址', '1827082629732850', '88', '1827082629732857')
3、但是,其中只有 ‘1827082629732850’, ‘1827082629732857’ 所对应的 type=5,其他的 id 的 type != 5。如图1
4、收集所有 type=5 的 value(即 image id),批量查询对应图片,附加 image 数据 。重新实现如下
$informations = ConventionCustomerServiceInformation::find()->select('id, group_id, type, label, value')->where([ 'convention_id' => $conventionId, ])->orderBy('order_number ASC')->asArray()->all(); // 批量查询对应图片 $images = []; $imageIds = $this->getImageValuesFrom($informations); if (!empty($imageIds)) { $images = Image::find() ->where(['id' => $imageIds]) ->indexBy('id') ->asArray() ->all(); } foreach($informations as $info){ if ($info['type'] == ConventionCustomerServiceInformation::TYPE_IMAGE) { $info['image'] = $images[$info['value']] ?? null; } else { $info['image'] = null; } $mappings[$info['group_id']]['informations'][] = $info; } /** * 获取所有 type = 5 的 value,即所有的图片 * @param array $models * @return array */ private function getImageValuesFrom(array $models): array { return ArrayHelper::getColumn( array_filter($models, function ($model) { return $model['type'] == ConventionCustomerServiceInformation::TYPE_IMAGE; }), 'value' ); }
5、生成的 SQL 如下,符合预期
SELECT * FROM `images` WHERE `id` IN ('1827082629732850', '1827082629732857')
近期评论