FuelPHP的orm和mysql不区分大小写`like`
Posted
技术标签:
【中文标题】FuelPHP的orm和mysql不区分大小写`like`【英文标题】:Case insensitive `like` with FuelPHP's orm and mysql 【发布时间】: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)
的列,否则这将是一个大小合适的烟球。
【参考方案1】:
解决方法是使用 FuelPHP 中提供的“自定义 SQL”查询功能,绕过语法限制,并将 SQL 查询字符串传递给数据库。
【讨论】:
以上是关于FuelPHP的orm和mysql不区分大小写`like`的主要内容,如果未能解决你的问题,请参考以下文章