没有不值得去解决的问题,也没有不值得去学习的技术!

在 Yii2 中,查询一个列表时,当 type=5 时,才需要基于 value 关联上 image 模型,如何避免 in 中的 value 多余?

但是,其中只有 '1827082629732850', '1827082629732857' 所对应的 type=5,其他的 id 的 type != 5
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
但是,其中只有 '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')


PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理