【发布时间】:2015-07-07 20:20:57
【问题描述】:
我正在使用 FuelPHP 和 MySQL,并希望使用 ORM 以不区分大小写的 like 查询对具有区分大小写排序规则的列进行查询。
例如,在我的 orm 模型中,我想做这样的事情:
public static function search_by_name($name)
{
return self::query()->where('name', 'like', '%' . $name . '%')->get();
}
这里的问题是,当我搜索$name = 'john' 时,表达式将不匹配列包含John 的行,反之亦然。
有人知道如何解决这个问题吗?
【问题讨论】:
-
mysql 字符串比较通常不区分大小写,除非您使用区分大小写的排序规则或
binary比较。最坏的情况下,您始终可以强制降低并进行比较,例如lower(foo) LIKE CONCAT('%', lower('bar'), '%') -
MySQL 语法允许
COLLATE关键字与字符串比较一起使用。例如,如果name是 latin1 字符集,使用区分大小写的排序规则,您可以与如下谓词进行不区分大小写的比较:name LIKE _latin1'%john%' COLLATE latin1_swedish_ci。 (我们希望文字与列的字符集匹配。我只是以 latin1 为例。) -
MarcB 是的,我正在使用区分大小写的排序规则。我通常会按照@spencer7593 的建议做,但我使用的是 ORM,而不是纯 sql
-
至于如何通过 FuelPHP 获得 MarcB 显示的形式或我之前评论中展示的形式的谓词......这可能只能使用
Custom SQL查询。但是你可以尝试一些表达式。看看有多大的烟球……->where('lower(name)','like','%'.strtolower($name).'%')-> -
如果 FuelPHP 在生成的 SQL 中将列名包装在反引号中,那么表达式将不起作用...生成的 SQL 将是
WHERE `lower(name)` LIKE。除非您创建了一个名为lower(name)的列,否则这将是一个大小合适的烟球。
标签: php mysql orm fuelphp fuelphp-orm