2 回答
TA贡献1811条经验 获得超6个赞
您的代码将创建类似的查询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)"
);
但最安全、最方便的选择可能是用于CDbCommand构建查询:
$result = Yii::app()->db->createCommand()
->select('column')
->from('table')
->where(['IN', 'id', $ids])
->queryColumn();
TA贡献1943条经验 获得超7个赞
我认为这是一种解决方法,但不是解决方案。我更改了代码以使用 CDbCriteria,但我发现它不是最佳的,因为它将获取所有字段。至少它产生了我预期的结果:
$c = new CDbCriteria();
$c->compare('some_id', $someIds);
$result = $this->findAll($c);
return array_column($result, 'column');
- 2 回答
- 0 关注
- 116 浏览
添加回答
举报