Doctrine Collections 表达式系统详解
collections Collections Abstraction Library 项目地址: https://gitcode.com/gh_mirrors/co/collections
表达式系统概述
Doctrine Collections 提供了一个强大的表达式系统,允许开发者以声明式的方式构建复杂的集合过滤条件。这个系统主要由三个核心组件构成:比较表达式(Comparison)、复合表达式(CompositeExpression)和条件对象(Criteria)。
比较表达式(Comparison)
比较表达式是构建过滤条件的基础单元,用于表示字段与值之间的比较关系。Doctrine Collections 提供了丰富的比较运算符:
- EQ:等于
- NEQ:不等于
- LT:小于
- LTE:小于等于
- GT:大于
- GTE:大于等于
- IS:是否为null
- IN:是否在给定数组中
- NIN:是否不在给定数组中
- CONTAINS:字符串包含
- MEMBER_OF:是否为集合成员
- STARTS_WITH:字符串开头匹配
- ENDS_WITH:字符串结尾匹配
使用示例:
use Doctrine\Common\Collections\Expr\Comparison;
// 创建"age大于等于18"的表达式
$expr = new Comparison('age', Comparison::GTE, 18);
复合表达式(CompositeExpression)
复合表达式用于组合多个比较表达式,支持三种逻辑运算符:
- AND (TYPE_AND):逻辑与,所有条件必须同时满足
- OR (TYPE_OR):逻辑或,至少一个条件满足
- NOT (TYPE_NOT):逻辑非,对条件取反
使用示例:
use Doctrine\Common\Collections\Expr\CompositeExpression;
// 创建复合表达式:(age >= 18) AND (name LIKE '%John%')
$expr1 = new Comparison('age', Comparison::GTE, 18);
$expr2 = new Comparison('name', Comparison::CONTAINS, 'John');
$compositeExpr = new CompositeExpression(
CompositeExpression::TYPE_AND,
[$expr1, $expr2]
);
Criteria 条件对象
Criteria 是表达式系统的入口点,它封装了过滤条件、排序规则和分页信息。
条件设置方法
-
where():设置主过滤条件
$criteria->where($expr);
-
andWhere():添加AND条件
$criteria->andWhere($expr);
-
orWhere():添加OR条件
$criteria->orWhere($expr);
排序与分页
-
orderBy():设置排序规则
use Doctrine\Common\Collections\Order; // 按name升序排列 $criteria->orderBy(['name' => Order::Ascending]); // 多字段排序 $criteria->orderBy([ 'lastName' => Order::Ascending, 'firstName' => Order::Ascending ]);
-
分页控制:
// 设置从第10条记录开始(偏移量) $criteria->setFirstResult(10); // 设置最多返回20条记录 $criteria->setMaxResults(20);
实际应用示例
假设我们有一个用户集合,需要筛选出年龄大于18岁且名字包含"John"或者邮箱以"@example.com"结尾的用户,并按年龄降序排列:
use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\Expr\Comparison;
use Doctrine\Common\Collections\Expr\CompositeExpression;
use Doctrine\Common\Collections\Order;
// 创建比较表达式
$ageExpr = new Comparison('age', Comparison::GT, 18);
$nameExpr = new Comparison('name', Comparison::CONTAINS, 'John');
$emailExpr = new Comparison('email', Comparison::ENDS_WITH, '@example.com');
// 创建复合表达式
$andExpr = new CompositeExpression(
CompositeExpression::TYPE_AND,
[$ageExpr, $nameExpr]
);
$orExpr = new CompositeExpression(
CompositeExpression::TYPE_OR,
[$andExpr, $emailExpr]
);
// 创建Criteria并设置条件
$criteria = new Criteria();
$criteria->where($orExpr);
$criteria->orderBy(['age' => Order::Descending]);
// 应用条件到集合
$filteredUsers = $users->matching($criteria);
最佳实践建议
-
表达式复用:对于常用的过滤条件,可以创建表达式工厂方法来复用代码。
-
链式调用:Criteria支持方法链式调用,可以使代码更简洁:
$criteria = (new Criteria()) ->where($expr1) ->andWhere($expr2) ->orderBy(['name' => 'ASC']) ->setFirstResult(0) ->setMaxResults(10);
-
性能考虑:对于大型集合,复杂的复合表达式可能会影响性能,应考虑使用数据库级别的过滤。
-
可读性:对于复杂的条件逻辑,建议拆分成多个步骤并添加注释,提高代码可维护性。
Doctrine Collections的表达式系统为PHP开发者提供了强大而灵活的集合操作能力,合理使用可以大大简化数据过滤和处理的代码复杂度。
collections Collections Abstraction Library 项目地址: https://gitcode.com/gh_mirrors/co/collections
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考