gpt4 book ai didi

php - Collections\Criteria::expr()、isNotNull 和 notLike

转载 作者:行者123 更新时间:2023-12-02 11:40:54 28 4
gpt4 key购买 nike

我正在使用Doctrine\Common\Collections\Criteria::expr()(不是查询构建器表达式)。

这个类中似乎没有实现 isNotNull()notLike() 运算符。

在这种情况下,执行 isNotNull()notLike() 的最佳方法是什么?

最佳答案

条件不为空

doctrine/orm ^2.4doctrine/collections ^1.2 中,有一个 is not null ,其行为类似于 Criteria::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));

然后由 QueryExpressionVisitor 检查。和 BasicEntityPersister,用于将查询构建为 Expr:isNotNull

case Comparison::NEQ:
if ($this->walkValue($comparison->getValue()) === null) {
return $this->expr->isNotNull($this->rootAlias . '.' . $comparison->getField());
}
<小时/>

喜欢和不喜欢的标准

对于 Criteria::expr()->like() 功能,Criteria::expr()->contains('property', 'value')相当于 SQL property LIKE %value%。但是,它不允许更改为 value%%value,而是 pull request (自 2.5.4 起) 使用已与 master 合并的提议的 startsWithendsWith 方法 - 因此可能会与 2.5.5 一起发布.

不幸的是,对于 Criteria::expr()->notLike() 和其他 LIKE 变体,\Doctrine\Common\Collections\ExpressionBuilder Criteria 使用的 code> 不支持它们。

此外,如果未定义比较运算符(例如 Comparison::CONTAINS),则 QueryExpressionVisitor 会抛出错误,并且 BasicEntityPersister,它可以防止手动定义您自己的Comparison 功能。

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#filtering-collections

<小时/>

自定义存储库替代方案

最好的替代方案是使用自定义存储库和 DBAL 查询生成器表达式来替代所需的功能。

使用自定义实体存储库来过滤结果集将防止对集合进行全表读取,并提高使用缓存时的速度。

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#custom-repositories

<小时/>

集合过滤器替代方案

另一种方法是使用filter来检索集合中对象的特定子集。

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class

class MyEntity
{
public function getCollectionFieldNotLike($value)
{
return $this->getCollection()->filter(function($a) use ($value) {
return (false === stripos($a->getField(), $value));
});
}

public function getCollectionFieldLike($value)
{
return $this->getCollection()->filter(function($a) use ($value) {
return (false !== stripos($a->getField(), $value));
});
}
}
$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'));
});

请记住,如上所述,这将强制对集合进行全表读取,因为它将需要检索记录以便能够过滤结果。

关于php - Collections\Criteria::expr()、isNotNull 和 notLike,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653651/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com