如何在原始 sql WHERE IN [LUMEN/LARAVEL] 中绑定命名参数

Posted

技术标签:

【中文标题】如何在原始 sql WHERE IN [LUMEN/LARAVEL] 中绑定命名参数【英文标题】:How bind named parameter in raw sql WHERE IN [LUMEN/LARAVEL] 【发布时间】:2021-11-20 03:52:35 【问题描述】:

Lumen 具有带 select 方法的 DB 外观

$results = DB::select('select * from users where id = :id', ['id' => 1]);

但这在 WHERE IN case 中不起作用。

DB::connection('db')->selectOne("many lines of sql WHERE my_id IN (:my_id) ", ["my_id" => $new_ids]);

当然,也可以使用查询生成器,

DB::connection()->table('users')->select()->whereIn(id, $new_ids)

但我想保存原始 SQL 以方便以后调试,因为我的 sql 过于全面,有很多连接。

【问题讨论】:

$new_ids 的值是多少?它应该是一个字符串,以逗号分隔。我真的认为如果使用得当,查询生成器更容易维护。并且会减少出现 SQL 错误的机会。 【参考方案1】:

所以我做了一些妥协。

我使用了查询生成器,但我可以将所有联接保存为原始格式。

恕我直言,我认为综合连接在原始格式中比在原始格式中更具可读性 使用匿名函数的查询生成器。

我的代码

DB::connection('super_db')->query()
            ->selectRaw(
            "very long sql INNER JOIN AND LEFT JOIN ON and other stuff...
                ")
            ->whereIn('my_id', $new_ids)
            ->groupBy('some_column')
            ->get();

所以,在 WHERE 部分之前的 sql 我可以以原始格式编写,但在 QB 格式的部分之后。

但现在它可以正常工作,安全且引用。

【讨论】:

以上是关于如何在原始 sql WHERE IN [LUMEN/LARAVEL] 中绑定命名参数的主要内容,如果未能解决你的问题,请参考以下文章

Lumen 的 And Where 和 Where 条件如何处理?

SQL:如何在同一行显示 WHERE IN 和 WHERE NOT IN?

SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”

如何使用 WHERE IN 子查询优化 SQL 查询

如何执行 IN() 和 WHERE=?使用 Spring 的 JDBCTemplate 进行 SQL 查询

如何使用 WHERE x IN 子句为 PreparedStatement 编写 SQL?