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

时间:2014-08-07 09:10:24

标签: php database laravel

在文档中,

$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 样式。但如果它不可能,那么我将只使用查询生成器。

的信息:

  • Laravel v4.2
  • 的PostgreSQL

3 个答案:

答案 0 :(得分:3)

可以使用更多 Query Builder 样式完成,例如:

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

修改

使用DB::select()的唯一可靠方法是:

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

它会生成正确的查询,我会根据数据库进行检查,还会生成空白数组,或者结果错误。即使这种方法以某种方式工作,你仍然必须手动转义表和列名称,这是乏味的,显然不起作用?如果你说有一个名为$column的{​​{1}}这个方法会破坏,因为values是一个保留字(至少在MySQL中)。

强烈建议使用Query Builder方法,因为它还会自动将SQL转义添加到表名和列名中。此外,它在数据库驱动程序中更具可移植性。它还轻松支持连接。无需使用您想要的方法。

答案 1 :(得分:0)

试试这个:

使用App \ User; //不要忘记将此添加到标题

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

答案 2 :(得分:0)

我找到工作的唯一途径

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

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