zee*_*tit 2 php case-insensitive laravel psql laravel-5
我在 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();
Run Code Online (Sandbox Code Playgroud)
输出/错误:带有消息“SQLSTATE[42P18]”的“PDOException”:不确定数据类型:7 错误:无法确定参数 $2 的数据类型
尝试查询生成器:
$_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();
Run Code Online (Sandbox Code Playgroud)
输出:无效的 FROM.. 表未找到
尝试过 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']) ) );
Run Code Online (Sandbox Code Playgroud)
输出:空数组
试过:
$_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']) ) );
});
Run Code Online (Sandbox Code Playgroud)
输出/错误:带有消息“SQLSTATE[42P18]”的“PDOException”:不确定数据类型:7 错误:无法确定参数 $2 的数据类型
我必须根据输入参数进行不区分大小写的搜索查询。
您的第三次尝试看起来像您想要的。根据您的第一次和最后一次尝试,您似乎希望将搜索文本包含在“%”中。由于您没有在第三次尝试中执行此操作,因此我假设这就是您的查询未找到任何结果(空数组)的原因。
查询应该是:
$_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']).'%');
}
Run Code Online (Sandbox Code Playgroud)
与 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();
}
Run Code Online (Sandbox Code Playgroud)
更多关于 PostgreSQL 文档:
可以使用关键字 ILIKE 代替 LIKE,以使匹配根据活动区域设置不区分大小写。这不在 SQL 标准中,而是 PostgreSQL 扩展。
| 归档时间: |
|
| 查看次数: |
8364 次 |
| 最近记录: |