如何使用 Yii@1.1 获取带有 WHERE IN 子句的 AllBySql?
How to fetchAllBySql with a WHERE IN clause using Yii@1.1?
遗留项目使用 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,其他的被忽略。)
我认为这是一种解决方法,但不是解决方案。我更改了我的代码以使用 CDbCriteria,但我发现它不是最理想的,因为它会获取所有字段。至少它产生了我预期的结果:
$c = new CDbCriteria();
$c->compare('some_id', $someIds);
$result = $this->findAll($c);
return array_column($result, 'column');
您的代码将创建类似 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]
);
或者避免使用参数而使用concatenation/interpolation,但是你需要先sanitize/quote值,以确保没有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();
遗留项目使用 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,其他的被忽略。)
我认为这是一种解决方法,但不是解决方案。我更改了我的代码以使用 CDbCriteria,但我发现它不是最理想的,因为它会获取所有字段。至少它产生了我预期的结果:
$c = new CDbCriteria();
$c->compare('some_id', $someIds);
$result = $this->findAll($c);
return array_column($result, 'column');
您的代码将创建类似 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]
);
或者避免使用参数而使用concatenation/interpolation,但是你需要先sanitize/quote值,以确保没有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();