Laravel postgres sql Case Insensitive Like

时间:2015-04-27 06:41:46

标签: php laravel laravel-5 psql case-insensitive

我在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的数据类型'

我必须根据输入参数进行不区分大小写的搜索查询。

3 个答案:

答案 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 有两个模式匹配选项:ILIKELIKE

  • 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 扩展。

https://www.postgresql.org/docs/8.3/functions-matching.html