我在Laravel中有一个postgres sql查询:
$_query = Article::join('users', 'articles.user_id', '=', 'users.id')
->select('users.*','articles.*');
if( array_key_exists('title', $parameters) && $parameters['title'] != '' )
$_query->whereRaw( " LOWER(nbl_region_ref.region) like LOWER('%?%')", array( trim($parameters['region']) ) );
$result = $_query->get();
输出/错误:' PDOException' with message' SQLSTATE [42P18]:Indeterminate datatype:7 ERROR:无法确定参数$ 2的数据类型'
Tried Query构建器:
$_query= DB::select("select users.*, articles.* from articles")
->join('users', 'articles.user_id', '=', 'users.id');
if( array_key_exists('title', $parameters) && $parameters['title'] != '' )
$_query->where( "articles.title","ILIKE", array( trim($parameters['title']) ) );
$result = $_query->get();
输出:找不到无效的.. ..表
尝试了ILike(基于类似的问题,没有加入)
$_query = Article::join('users', 'articles.user_id', '=', 'users.id')
->select('users.*','articles.*');
if( array_key_exists('title', $parameters) && $parameters['title'] != '' )
$_query->where( "articles.title","ILIKE", array( trim($parameters['title']) ) );
输出:空数组
试过:
$_query = Article::join('users', 'articles.user_id', '=', 'users.id')
->select('users.*','articles.*');
$_query->where( function ( $_queryTemp ) use ( $parameters ) {
if( array_key_exists('title', $parameters) && $parameters['title'] != '' )
$_query->whereRaw( " LOWER(nbl_region_ref.region) like LOWER('%?%')", array( trim($parameters['region']) ) );
});
输出/错误:' PDOException' with message' SQLSTATE [42P18]:Indeterminate datatype:7 ERROR:无法确定参数$ 2的数据类型'
我必须根据输入参数进行不区分大小写的搜索查询。
答案 0 :(得分:4)
你的第三次尝试看起来像你想要的。根据您的第一次和最后一次尝试,您希望搜索文本包含在'%'中。由于你没有为第三次尝试做到这一点,我假设你的查询没有找到任何结果(空数组)。
查询应该是:
$_query = Article::join('users', 'articles.user_id', '=', 'users.id')
->select('users.*','articles.*');
if (array_key_exists('title', $parameters) && $parameters['title'] != '') {
$_query->where('articles.title', 'ILIKE', '%'.trim($parameters['title']).'%');
}
答案 1 :(得分:0)
使用ILIKE
代替LIKE
为我解决了
答案 2 :(得分:0)
与 MySQL 不同,PostgreSQL 有两个模式匹配选项:ILIKE
和 LIKE
。
ILIKE
用于区分大小写LIKE
用于区分大小写如果您想基于不敏感的值进行查询,例如 title
。您应该使用 ILIKE
。
// app/Models/Article.php
public static function getByTitle($title){
return self::where('title', 'ilike', "%${title}%")->orderBy('title', 'asc')->get();
}
有关 PostgreSQL 文档的更多信息:
<块引用>可以使用关键字 ILIKE 代替 LIKE 进行匹配 根据活动区域设置不区分大小写。这不是在 SQL 标准,但它是 PostgreSQL 扩展。