【问题标题】:How to bind a dynamic list to a WHERE IN query如何将动态列表绑定到 WHERE IN 查询
【发布时间】:2021-12-04 05:38:12
【问题描述】:

下面的查询有一个 IN 条件,我想将部门代码的动态列表绑定到该条件,而不是像现在这样直接在查询中传递代码。我该怎么做?

<?php

  $params = [
            ':academicYear' => $academicYear
        ];

  $sql = "SELECT 
        MUTHONI.COURSES.COURSE_CODE, MUTHONI.COURSES.COURSE_CODE
        FROM MUTHONI.MARKSHEET_DEF 
        INNER JOIN MUTHONI.COURSES ON MUTHONI.MARKSHEET_DEF.COURSE_ID = 
        MUTHONI.COURSES.COURSE_ID
        WHERE MUTHONI.MARKSHEET_DEF.MRKSHEET_ID LIKE CONCAT(:academicYear, '%')
        AND MUTHONI.COURSES.DEPT_CODE IN ('B16','B17','B18','B19','B20','B21')";

  $connection->createCommand($sql)->bindValues($params)->queryScalar();

【问题讨论】:

  • 创建一个数组,例如$codes = array('B16','B17','B18','B19','B20','B21')并将其传递给IN ($codes)
  • 不幸的是,您必须分别绑定每个代码。当然你也可以使用foreachimplode,让它与代码数量无关。
  • @MainulHasan 并面临 SQL 注入问题。相反,最好构建与数组中的项目数一样多的?,然后使用一般准备好的语句。的绑定一些集合变量。
  • 这能回答你的问题吗? Can I bind an array to an IN() condition?

标签: php sql oracle yii2


【解决方案1】:

您可以使用查询生成器。它将为您解析参数绑定。

$codes = ['B16','B17','B18','B19','B20','B21'];
$query = (new \yii\db\Query())
    ->select(['MUTHONI.COURSES.COURSE_CODE', 'MUTHONI.COURSES.COURSE_CODE'])
    ->from('MUTHONI.MARKSHEET_DEF')
    ->innerJoin(
        'MUTHONI.COURSES',
        'MUTHONI.MARKSHEET_DEF.COURSE_ID = MUTHONI.COURSES.COURSE_ID'
    )->where(
        new \yii\db\Expression(
            "MUTHONI.MARKSHEET_DEF.MRKSHEET_ID LIKE CONCAT(:academicYear, '%')",
             [':academicYear' => $academicYear]
        )
    )->andWhere(['in', 'MUTHONI.COURSES.DEPT_CODE', $codes]);

$result = $query->scalar();

查询生成器将为您创建一个参数并为您绑定 $codes 数组中每个项目的值。

您也可以使用替代语法:

andWhere(['MUTHONI.COURSES.DEPT_CODE' => $codes])

PS:我从未在 Yii 中使用过 Oracle,所以我不确定表/列名称是否正确编写。查询构建器对每个 DBMS 的工作方式都相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2021-07-22
    • 2015-01-06
    • 2015-10-12
    • 2017-10-13
    • 2013-05-03
    • 2010-09-15
    相关资源
    最近更新 更多