[当我在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,似乎也无法使它返回任何内容
欢迎任何建议。
如何通过这种方式动态设置值?这是一个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);
}
此方法行不通,因为底层机制是PDO,并且每个参数都需要一个值。您正试图欺骗它,使其接受逗号分隔的参数列表,但这将不起作用。
请参见PDO with "WHERE... IN" queries以了解此方法。您可以使用majimboo提供的内容,并添加一些将通过您的value数组并生成in语句的代码,如下所示:
WHERE id IN (:val1, :val2, etc)
或者您也可以将其渲染为:
WHERE id IN (?, ?, ?)
然后接受传递实际替换值的数组。
但是,我同意majimboo,您应该能够将querybuilder用于此查询。它具有whereIn()方法来帮助您完成那部分查询,因此您不必编写自己的查询语法生成代码。
我与DB :: select()有相同的船……除了这个,我还没有找到任何好的解决方案:
PDO with "WHERE... IN" queries
$array = [...];
$stringList = implode(",", $array);
$result = DB::select('....... WHERE id IN ('.$stringList.')');
因此参数实际上不是参数,而是准备好的字符串,您可以将其注入到SQL查询中。它绝对不优雅也不安全,但是我发现这是唯一可行的解决方案。在注入子字符串之前,请确保已检查所有可能的情况!
尝试类似的东西:
$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
)
);