WHERE子句中带IN的Laravel 4 DB :: raw查询不适用于MySQL参数

问题描述 投票:1回答:4

[当我在Laravel 4中对MySQL执行以下查询作为DB:select DB:raw查询时,它不返回结果。 (请注意,本示例已将实际查询截断了。)

SELECT user_id, email, first_name, last_name, photo_small
FROM users AS u
JOIN profiles AS p ON p.user_id = u.id
 WHERE email IN (?) ....

其中$ p =“ email.address1@com”,“ xyz.xxx @ .edu”,而$ p是参数

但是,当我执行以下操作时

SELECT user_id, email, first_name, last_name, photo_small
FROM users AS u
JOIN profiles AS p ON p.user_id = u.id
 WHERE email IN ("email.address1@com","[email protected]") ....

我确实得到了结果。

我已经确认参数的值,使用DB::getQueryLog()检查SQL和绑定,并使用单独的db工具验证了结果。

出于明显的原因,我真的很想避免未参数化的查询,但是即使它是有效的SQL,似乎也无法使它返回任何内容

欢迎任何建议。

mysql laravel laravel-4
4个回答
2
投票

如何通过这种方式动态设置值?这是一个ID列表,但我确定您可以看到如何将其调整为适合电子邮件。

public function getDataByIds($idArray)
{
    $parametersString="";
    $parameters=[];
    for($i=0; $i<count($idArray);$i++)
    {
        $parameterName = ":id" . $i;
        $parametersString .= $parameterName . ",";
        $parameters[$parameterName]=$idArray[$i];
    }
    $parametersString=substr($parametersString, 0, -1);
    $query = $this->getQuery("SELECT blah WHERE id IN (".$parametersString.")");
    return DB::select(DB::raw($query), $parameters);
}

1
投票

此方法行不通,因为底层机制是PDO,并且每个参数都需要一个值。您正试图欺骗它,使其接受逗号分隔的参数列表,但这将不起作用。

请参见PDO with "WHERE... IN" queries以了解此方法。您可以使用majimboo提供的内容,并添加一些将通过您的value数组并生成in语句的代码,如下所示:

WHERE id IN (:val1, :val2, etc)

或者您也可以将其渲染为:

WHERE id IN (?, ?, ?)

然后接受传递实际替换值的数组。

但是,我同意majimboo,您应该能够将querybuilder用于此查询。它具有whereIn()方法来帮助您完成那部分查询,因此您不必编写自己的查询语法生成代码。


1
投票

我与DB :: select()有相同的船……除了这个,我还没有找到任何好的解决方案:

PDO with "WHERE... IN" queries

$array = [...];
$stringList = implode(",", $array);
$result = DB::select('....... WHERE id IN ('.$stringList.')');

因此参数实际上不是参数,而是准备好的字符串,您可以将其注入到SQL查询中。它绝对不优雅也不安全,但是我发现这是唯一可行的解​​决方案。在注入子字符串之前,请确保已检查所有可能的情况!


0
投票

尝试类似的东西:

$array = [...];                    // your array
$strArray = implode(",", $array);  // covert it to a comma delimited string
DB::raw("
...
WHERE email IN ($strArray)         // call the comma delimited string of the array
...
");

应与DB::select()相同但是,为什么不使用Eloquent?


也请使用单引号,例如:$p = "'email.address1@com', '[email protected]'";


仅需说明

警告仔细检查

$results = DB::select('SELECT * FROM users WHERE id IN (?)', array($strArray));

另一个想法

DB::select( 
  DB::raw("SELECT * FROM my_table WHERE id IN (:strArray)"), array(
    'strArray' => $strArray
  )
);
© www.soinside.com 2019 - 2024. All rights reserved.