FuelPHP的orm和mysql不区分大小写`like`

Posted

技术标签:

【中文标题】FuelPHP的orm和mysql不区分大小写`like`【英文标题】:Case insensitive `like` with FuelPHP's orm and mysql 【发布时间】:2015-07-07 20:20:57 【问题描述】:

我正在使用 Fuelphpmysql,并希望使用 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) 的列,否则这将是一个大小合适的烟球。 【参考方案1】:

解决方法是使用 FuelPHP 中提供的“自定义 SQL”查询功能,绕过语法限制,并将 SQL 查询字符串传递给数据库。

【讨论】:

以上是关于FuelPHP的orm和mysql不区分大小写`like`的主要内容,如果未能解决你的问题,请参考以下文章

FuelPHP ORM - 未找到属性

使用 FuelPHP 从 ORM 返回 _data 数组

如何在fuelPHP Orm模型中选择MAX或COUNT

如何为fuelphp ORM关系设置动态条件

FuelPHP ORM无法插入相关表

MySQL - 模糊搜索 LIKE BINARY 和 LIKE