doctrine2 dql,使用setParameter与%通配符进行类似的比较 [英] doctrine2 dql, use setParameter with % wildcard when doing a like comparison
问题描述
我想使用参数占位符 - 例如?1 - 使用%通配符。就是这样:u.name LIKE%?1%(虽然这会引发错误)。该文档有以下两个示例:
1。
I want to use the parameter place holder - e.g. ?1 - with the % wild cards. that is, something like: "u.name LIKE %?1%" (though this throws an error). The docs have the following two examples: 1.
// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%'))
public function like($x, $y); // Returns Expr\Comparison instance
我不喜欢这样,因为没有防止代码注入的保护。
I do not like this as there is no protection against code injection.
2。
// $qb instanceof QueryBuilder
// example8: QueryBuilder port of: "SELECT u FROM User u WHERE u.id = ?1 OR u.nickname LIKE ?2 ORDER BY u.surname DESC" using QueryBuilder helper methods
$qb->select(array('u')) // string 'u' is converted to array internally
->from('User', 'u')
->where($qb->expr()->orx(
$qb->expr()->eq('u.id', '?1'),
$qb->expr()->like('u.nickname', '?2')
))
->orderBy('u.surname', 'ASC'));
我不喜欢这个,因为我需要搜索对象属性中的术语 - 也就是说,我需要任何一方的通配符。
I do not like this because I need to search for terms within the object's properties - that is, I need the wild cards on either side.
推荐答案
当绑定参数到查询时,DQL几乎完全像PDO(这是什么Doctrine2在引擎盖下使用)。
When binding parameters to queries, DQL pretty much works exactly like PDO (which is what Doctrine2 uses under the hood).
所以当使用LIKE语句时,PDO将关键字和%通配符都视为单个标记。您不能在占位符旁边添加通配符。绑定参数时,必须将它们附加到字符串。
So when using the LIKE statement, PDO treats both the keyword and the % wildcards as a single token. You cannot add the wildcards next to the placeholder. You must append them to the string when you bind the params.
$qb->expr()->like('u.nickname', '?2')
$qb->getQuery()->setParameter(2, '%' . $value . '%');
看到这个评论在PHP手册中。希望有帮助。
See this comment in the PHP manual. Hope that helps.
这篇关于doctrine2 dql,使用setParameter与%通配符进行类似的比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!