【问题标题】:WHERE IN array binding in DB::raw laravel 5.4DB::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);

标签: php database laravel laravel-5


【解决方案1】:
$arr = [1,2,3];
$placeholders = implode(",", array_fill(0, count($arr), '?'));

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

这个例子:

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

在这个例子中,我用与数组长度相等的问号数量填充了一个新数组。然后我粘合新数组,用逗号分隔,并得到“?,?,?,...”。然后我在括号运算符“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

    【讨论】:

    • 通常这会起作用,但我必须在原始查询中执行此操作,因为我在原始查询中使用了其他东西
    猜你喜欢
    • 2019-08-20
    • 2014-12-02
    • 2017-06-14
    • 2017-06-16
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2018-07-06
    • 2017-12-04
    相关资源
    最近更新 更多