为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Yii@1.1通过 WHERE IN 子句获取AllBySql ?

如何使用Yii@1.1通过 WHERE IN 子句获取AllBySql ?

PHP
慕桂英546537 2023-10-01 17:22:59
遗留项目使用yii@1.1 。我想在CActiveRecord.原始 sql 中的查询将是:SELECT columnFROM tableWHERE some_id in (1, 32, 10)当我直接查询数据库时它工作得很好。我得到了所有结果。我class MyActiveRecord extends CActiveRecord通过 yii 中的以下方法将其映射到我的活动记录 ( ) 中:    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。)
查看完整描述

2 回答

?
杨魅力

TA贡献1811条经验 获得超5个赞

您的代码将创建类似的查询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();


查看完整回答
反对 回复 2023-10-01
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我认为这是一种解决方法,但不是解决方案。我更改了代码以使用 CDbCriteria,但我发现它不是最佳的,因为它将获取所有字段。至少它产生了我预期的结果:


$c = new CDbCriteria();

$c->compare('some_id', $someIds);

$result = $this->findAll($c);


return array_column($result, 'column');


查看完整回答
反对 回复 2023-10-01
  • 2 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信