在Laravel中使用带有LIKE子句和可变列名的DB::select()

0vvn1miw  于 2023-01-06  发布在  其他
关注(0)|答案(5)|浏览(141)

在文件里,

$results = DB::select('select * from users where id = ?', array(1));

问题
我有一个变量$column$value,我想让它们根据如下所示的列搜索数据库:

$results = DB::select('select * from users where ? LIKE "%?%"', array($column, $value));

但这会抛出一个错误:

SQLSTATE[42P18]: Indeterminate datatype: 7 ERROR: could not determine data type of parameter $2 (SQL: SELECT * FROM test WHERE refno LIKE '%te%')

我试着像这样硬编码这个值:

$results = DB::select('select * from users where ? LIKE "%te%"', array($column));

但它返回一个空数组。
我该怎么做?请帮帮我。

编辑:

这个查询实际上很长(有多个连接)。所以如果可能的话,我不喜欢使用 * Query Builder * 风格。但是如果不可能的话,我将只使用Query Builder。
信息:

    • 拉瑞维尔v4.2 *
    • PostgreSQL语言 *
0yg35tkg

0yg35tkg1#

它可以用更 * Query Builder * 的风格来完成,如下所示:

$results = DB::table('users')
    ->where($column, 'LIKE', '%' . $value . '%')
    ->get();
    • 编辑**

使用DB::select()执行此操作的唯一可靠方法是:

$results = DB::select("select * from users where ? LIKE '%?%'", array($column, $value));

它产生了正确的查询,我对照数据库检查了它,但也有一个空数组,或错误的结果。即使这个方法以某种方式工作,你仍然必须手动转义表和列名,这是乏味的,显然不适用于?。如果你让我们假设有一个名为values$column,这个方法会中断,因为values是保留字(至少在MySQL中是这样)。
强烈建议使用Query Builder方法,因为它还可以自动将SQL转义添加到表名和列名中。而且它在DB驱动程序之间的可移植性更强。它还可以轻松地支持连接。无需使用您想要的方法。

8yoxcaq7

8yoxcaq72#

我找到工作的唯一方法

$phone = '%'.$phone.'%';

$seachbyphone = DB::select('SELECT * FROM user WHERE phoneno LIKE ?',[$phone]);
bvuwiixz

bvuwiixz3#

    • 试试这个:**

使用应用程序\用户; //不要忘记将此添加到标头
$result =用户::where('列名称','类似'," % $值%")-〉get();

ruoxqz4g

ruoxqz4g4#

LIKE '%?%'"不正确。它只能是?,因为sql查询只需要? =〉vacency/占位符作为值。不能使用单个逗号或通配符。

所以你需要用 value 而不是? =〉(占位符)来添加%符号,而且它也是安全的。

所以我们需要

$results = DB::select("select * from users where ? LIKE ?, [$column, '%'.$value.'%'.]);
de90aj5v

de90aj5v5#

我不会向任何人推荐DB::select(),即使你有完全有效的SQL,直接在数据库引擎中工作Laravel会产生特殊的错误和虚构的错误描述。

相关问题