如何解决如何使用Yii@1.1通过WHERE IN子句获取fetchAllBySql?
旧项目使用yii@1.1。我想在CActiveRecord
内创建查询。
原始sql中的查询为:
SELECT column
FROM table
WHERE some_id in (1,32,10)
,当我直接查询数据库时,它工作正常。我得到了所有结果。
我通过yii中的以下方法将其映射到活动记录(class MyActiveRecord extends CActiveRecord
)中:
public function getColumn(array $someIds): array
{
$idList = rtrim(implode(',',$someIds),');
$sql = "SELECT column FROM table WHERE some_id IN (:idList)";
$results = parent::model(__CLASS__)->findAllBySql(
$sql,['idList' => $idList]
);
return array_column($results,'column');
}
该代码有效,但奇怪的是它仅获取第一个some_id
的结果。如何获取所有这些信息?
假设我的ID为1,我有5个结果,有32个结果为3,有10个结果为2,我希望总共有10条记录。
但是我只得到yii中ID 1的5个结果。我在做什么错了?
(当我更改ID的顺序时,总是仅会提取第一个ID,而其他ID将被忽略。)
解决方法
您的代码将创建类似SELECT column FROM table WHERE some_id IN ('1,32,10')
的查询-您正在使用一个参数,并将其作为一个字符串值传递给查询。要独立传递每个ID,您必须使用多个参数:
$results = parent::model(__CLASS__)->findAllBySql(
'SELECT column FROM table WHERE some_id IN (:id1,:id2,:id3)',['id1' => 1,'id2' => 32,'id3' => 10]
);
或者避免使用参数并使用串联/内插,但是您需要先清理/引用值,以确保不存在SQL注入风险:
$ids = implode(',',array_map('intval',$someIds);
$results = parent::model(__CLASS__)->findAllBySql(
"SELECT column FROM table WHERE some_id IN ($ids)"
);
但最安全,最方便的选择可能是使用https://medium.com/@manu.me/bdd-simplified-with-springboot-b56ffdcadb2b建立查询:
$result = Yii::app()->db->createCommand()
->select('column')
->from('table')
->where(['IN','id',$ids])
->queryColumn();
,
我认为这是一种解决方法,但不是解决方案。我更改了代码以使用CDbCriteria,但是我发现它不是最优的,因为它将获取所有字段。至少它能产生我的预期结果:
$c = new CDbCriteria();
$c->compare('some_id',$someIds);
$result = $this->findAll($c);
return array_column($result,'column');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。