使用Laravel中的DB::select()和LIKE子句以及变量列名


Using DB::select() in Laravel with LIKE clause and a variable column name

在文档中,

$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));

但它返回一个空白数组。

我该怎么做?请帮忙。

编辑:

查询实际上很长(有多个联接(。因此,如果可能的话,我不喜欢使用查询生成器样式。但如果这不可能,那么我将只使用查询生成器。

信息:

  • Laravel v4.2
  • PostgreSQL

它可以用更多的查询生成器风格来完成,比如:

$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驱动程序之间更具可移植性。它还可以轻松地支持联接。无需使用您想要的方法。

我找到工作的唯一方法

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

试试这个:

使用App''User//别忘了把这个添加到标题

$result=User::where('columnName','LIKE',"%$value%"(->get((;

LIKE '%?%'"不正确。它必须仅为?,因为sql查询仅要求?=>值的空位/占位符。没有任何逗号或通配符。

所以您需要添加带有值的%符号而不是带有?=>(占位符(及其安全性

这就是为什么我们需要

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

我不会向任何人推荐DB::select(),即使您有完全有效的SQL,可以直接在数据库引擎中工作。Laravel会通过虚构的错误描述产生特殊的错误。请改用DB::table('my_table')->select('...')