- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Doctrine\Common\Collections\Criteria::expr()
(不是查询构建器表达式)。
这个类中似乎没有实现 isNotNull()
和 notLike()
运算符。
在这种情况下,执行 isNotNull()
和 notLike()
的最佳方法是什么?
最佳答案
在 doctrine/orm ^2.4
或 doctrine/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 合并的提议的 startsWith
和 endsWith
方法 - 因此可能会与 2.5.5 一起发布.
不幸的是,对于 Criteria::expr()->notLike()
和其他 LIKE
变体,\Doctrine\Common\Collections\ExpressionBuilder
Criteria 使用的 code> 不支持它们。
此外,如果未定义比较运算符(例如 Comparison::CONTAINS
),则 QueryExpressionVisitor
会抛出错误,并且 BasicEntityPersister
,它可以防止手动定义您自己的Comparison
功能。
最好的替代方案是使用自定义存储库和 DBAL 查询生成器表达式来替代所需的功能。
使用自定义实体存储库来过滤结果集将防止对集合进行全表读取,并提高使用缓存时的速度。
<小时/>另一种方法是使用filter
来检索集合中对象的特定子集。
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/
我得到了以下 sequelize 查询片段,我喜欢在其中执行多个 notLike 查询: article .findAndCountAll({ where: { N
我已经配置了 Spring Data Repository (mongoDB) 和 Author 实体,如下所示: Repository : public interface AuthorRep
我编写了一个脚本,它将递归指定的文件夹并对其中的文件进行一些分析。我需要在分析中排除指定的子文件夹。此排除列表会根据正在分析的基本文件夹而变化。我的脚本使用这样的长模式: Get-ChildItem
我正在使用Doctrine\Common\Collections\Criteria::expr()(不是查询构建器表达式)。 这个类中似乎没有实现 isNotNull() 和 notLike() 运算
我有这个代码 async getHisDataByTime(startTime, endTime, ids) { console.log("getHisDataByTime >
我是一名优秀的程序员,十分优秀!