Php Collections\Criteria::expr(),isNotNull和notLike
我使用的是Php Collections\Criteria::expr(),isNotNull和notLike,php,doctrine-orm,Php,Doctrine Orm,我使用的是Doctrine\Common\Collections\Criteria::expr()(不是查询生成器表达式) 似乎isNotNull()和notLike()操作符没有在这个类中实现 在这种情况下,执行isNotNull()和notLike()的最佳方法是什么?标准不为NULL 在条令/orm^2.4或条令/collections^1.2中,具有类似标准::expr()->isNotNull('field')的非空,可以使用 $criteria = Criteria::create(
Doctrine\Common\Collections\Criteria::expr()
(不是查询生成器表达式)
似乎isNotNull()
和notLike()
操作符没有在这个类中实现
在这种情况下,执行isNotNull()
和notLike()
的最佳方法是什么?标准不为NULL
在条令/orm^2.4
或条令/collections^1.2
中,具有类似标准::expr()->isNotNull('field')的非空
,可以使用
$criteria = Criteria::create();
$expr = $criteria::expr();
$collection->matching($criteria->where($expr->neq('field', null)));
这与表达式生成器创建Expr::isNull
的方式相同,但通过以下方式将比较运算符更改为comparison::NEQ
:
return new Comparison($field, Comparison::EQ, new Value(null));
然后由和BasicEntityPersister
检查,用于将查询构建为Expr:isNotNull
案例比较::NEQ:
if($this->walkValue($comparison->getValue())==null){
返回$this->expr->isNotNull($this->rootAlias....$comparison->getField());
}
喜欢与不喜欢的标准
对于Criteria::expr()->like()
功能,Criteria::expr()->包含('property','value')
与SQL属性like%value%
等效。但是,它不允许更改为value%
或%value
,而是允许(从2.5.4开始)使用已与master合并的方法启动和结束方法,因此可与2.5.5一起发布
不幸的是,对于Criteria::expr()->notLike()
和其他LIKE
变体,Criteria使用的\doctor\Common\Collections\ExpressionBuilder
不支持它们
此外,如果未定义比较运算符(例如comparison::CONTAINS
),则QueryExpressionVisitor
和basicintypersister
会引发错误,从而阻止手动定义自己的比较功能
自定义存储库替代方案
最好的替代方法是使用自定义存储库和DBAL查询生成器表达式来替代所需的功能
使用自定义实体存储库筛选结果集将防止对集合进行完整的表读取,并提高使用缓存时的速度
收集过滤器替代方案
另一种方法是使用filter
检索集合中对象的特定子集
用于存储库中两者的过程语法组合
$criteria = Criteria::create();
$expr = $criteria::expr();
$criteria->where($expr->neq('field', null));
$collection = $entityManager->getRepository('app:MyEntity')->matching($criteria);
$collectionNotLike = $collection->filter(function($a) {
return (false === strpos($a->getField(), 'value'));
});
请记住,如上所述,这将强制对集合读取完整的表,因为它需要检索记录才能筛选结果。是否有任何选项可以从$criteria获取纯SQL?有些人认为,像$criteria->toString()一样,最好的选择是使用EntityPersister
。像这样echo$em->getUnitOfWork()->getEntityPersister('app:MyEntity')->getSelectSQL($criteria)
要获取参数值,请在criteria对象上使用expandCriteriaParameters
方法。类似于这样:list($params,$types)=$em->getUnitOfWork()->getEntityPersister('app:MyEntity')->expandCriteriaParameters($criteria)
然后以您喜欢的方式输出参数print\r($params)代码>$expr->neq('field',null)
在原则2.3.3中不起作用,因为它导致字段!=NULL
而不是字段在SQL查询中不为NULL
。您可以使用从未经常使用的值作为解决方法,例如,$expr->neq('field',-1)
条令ORM 2.5或条令集合1.2中的比较运算符,但是条令ORM 2.4中应用了expr:isNotNull()
,更新了答案以反映版本约束和添加的引用
$entity->getCollectionFieldNotLike('value');
$entity->getCollectionFieldLike('value');
$criteria = Criteria::create();
$expr = $criteria::expr();
$criteria->where($expr->neq('field', null));
$collection = $entityManager->getRepository('app:MyEntity')->matching($criteria);
$collectionNotLike = $collection->filter(function($a) {
return (false === strpos($a->getField(), 'value'));
});