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'));
});