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 中的数组绑定在哪里的主要内容,如果未能解决你的问题,请参考以下文章