DB::raw laravel 5.4 中的数组绑定在哪里

Posted

技术标签:

【中文标题】DB::raw laravel 5.4 中的数组绑定在哪里【英文标题】:WHERE IN array binding in DB::raw laravel 5.4 【发布时间】:2018-01-24 10:10:36 【问题描述】:

我正在尝试在 Laravel DB 的原始 WHERE IN 查询中绑定一个数组

示例:

$arr = [1,2,3];
DB::select(DB::raw("select * from test1 WHERE id IN ? "), [$arr]);

由于某种原因,数组没有被更改为以下查询:

select * from test1 WHERE id IN (1,2,3)

有人知道我能不能做到这一点吗?

【问题讨论】:

尝试:DB::select(DB::raw("select * from test1 WHERE id IN ? "), $arr); 【参考方案1】:
$arr = [1,2,3];
$placeholders = implode(",", array_fill(0, count($arr), '?'));

DB::select("select * from test1 WHERE id IN ($placeholders)", $arr);

这个例子:

    支持任意长度的数组 不包含循环 安全地传递参数

在这个例子中,我用与数组长度相等的问号数量填充了一个新数组。然后我粘合新数组,用逗号分隔,并得到“?,?,?,...”。然后我在括号运算符“IN”之间插入这个子字符串。我将项目数组本身作为 select 函数的第二个参数传递。因此,元素数组的每个元素在“IN”运算符中都有自己的占位符。

【讨论】:

虽然这可能会回答这个问题,但最好还包括解释它解决问题的原因(它是如何工作的),以便任何未来的读者都可以从中学习。 我同意上述评论。此答案中的代码很好,但没有解释为什么这样做,为什么需要这样做,以及这个答案如何比其他现有答案更好。 @El_Vanja 这个例子支持任意长度的数组。不包含循环。安全地传递参数。这个例子有效,因为我用这样数量的问号填充了一个新数组,这些问号等于参数数组的元素数量。然后我粘合数组,用逗号分隔,并得到“?,?,?,...”。然后我在括号运算符“IN”之间插入这个子字符串。我将项目数组本身作为 select 函数的第二个参数传递。因此,元素数组的每个元素在“IN”运算符中都有自己的占位符 @nilecrocodile 是的,由于我的经验,我可以破译正在发生的事情。我不是在为自己寻求解释,我想指出您应该始终在答案本身中包含解释。这样,当没有经验的人阅读它时,他们至少可以大致了解这里发生了什么。我建议您编辑答案并在其中包含您的评论内容。有些人只浏览 cmets,可能会错过那里提供的其他信息。 @El_Vanja 已更正。感谢您的评论。【参考方案2】:

试试:

$array = [2,5,9,7,5];
$arrPos = [];
$arrBind = [];
foreach ($array as $pos => $id) 
    $arrPos[] = ":id_$pos";
    $arrBind["id_$pos"] = $id;


$sql = 
"  SELECT * FROM test1 WHERE id IN (".implode(', ', $arrPos).") ";
$rs = DB::select($sql, $arrBind);

【讨论】:

【参考方案3】:

在 laravel 中试试:

$arr = [1,2,3];
$result = DB::table('test1')->whereIn('id', $arr)->get();
dd($result);

并将这个用于您的原始查询:

$arr = [1,2,3];
$arr = join(",",$arr);
$result =  DB::select(DB::raw("SELECT * FROM test1 WHERE id IN (".$arr.")"));
dd($result);

为了防止 sql 注入,您可以使用我在下面提到的方法。

 $arr = [1,2];
 $arr = join(",",$arr);
 $result =  DB::select(DB::raw("SELECT * FROM test1 WHERE id IN (?,?)"),$arr);
 dd($result);

它会为你工作。

【讨论】:

通常这会起作用,但我必须在原始查询中执行此操作,因为我在原始查询中使用了其他东西 我也为原始查询编辑了我的帖子,请检查一下 @gauraw 您必须计算 $arr 才能准备一个“?”块。没必要。 @Davuz 这只是一个例子,当然我们可以计算 $arr 来为此准备一个块。【参考方案4】:

或雄辩:

$q= TestModel::where('id',$arr)->get();

【讨论】:

在复杂查询中为真,但在简单查询中为什么不使用 eloquent ;) 是的,我知道我说的是一般情况,没问题兄弟,祝你好运^^【参考方案5】:

DB::table("test1")->whereIn('id', $arr)->get();

https://laravel.com/docs/5.4/queries#where-clauses

【讨论】:

通常这会起作用,但我必须在原始查询中执行此操作,因为我在原始查询中使用了其他东西

以上是关于DB::raw laravel 5.4 中的数组绑定在哪里的主要内容,如果未能解决你的问题,请参考以下文章

yajra / laravel-datatables搜索不适用于laravel 5.4

如何在laravel 5.4中进行左连接

Laravel 中的 DB Raw 查询错误

laravel DB 执行 mysql函数或者字段

Laravel 4 无法运行整个 RAW 查询

Laravel DB::raw 绑定参数