Symfony 3.4中查询实体对象时如何排除指定不需要的关联属性
Symfony Category实体自定义查询实现方案
你当前使用的findAll()方法存在两个问题:没有添加description不为空的过滤条件,且默认返回实体所有字段、触发不必要的关联加载。可以通过自定义查询实现需求:
实现逻辑
- 新增查询条件过滤
description IS NOT NULL的分类 - 关联预加载
members属性,避免后续使用时出现N+1查询问题 - 无需主动处理
books关联,Doctrine默认延迟加载未调用的关联属性,只要你后续不访问该属性就不会被查询和返回,如涉及接口序列化可通过序列化组显式排除
代码实现
方式1:Repository新增自定义方法(推荐)
在AppBundle\Repository\CategoryRepository中新增查询方法:
public function findValidCategoriesWithMembers() { return $this->createQueryBuilder('c') ->where('c.description IS NOT NULL') ->leftJoin('c.members', 'm') ->addSelect('m') ->getQuery() ->getResult(); }
业务代码中调用:
$em->getRepository('AppBundle:Category')->findValidCategoriesWithMembers();
方式2:直接编写DQL查询
无需修改Repository,可直接在业务代码中执行DQL:
$dql = 'SELECT c, m FROM AppBundle:Category c LEFT JOIN c.members m WHERE c.description IS NOT NULL'; $categories = $em->createQuery($dql)->getResult();
序列化场景补充
如果需要将查询结果序列化为接口返回数据,可通过Symfony序列化组配置显式控制返回字段:
// AppBundle\Entity\Category use Symfony\Component\Serializer\Annotation\Groups; class Category { /** * @Groups({"category_output"}) */ private $id; /** * @Groups({"category_output"}) */ private $name; /** * @Groups({"category_output"}) */ private $description; /** * @Groups({"category_output"}) */ private $members; // 未添加category_output组,序列化时自动排除 private $books; }
序列化时指定对应分组即可:
$json = $serializer->serialize($categories, 'json', [ 'groups' => ['category_output'] ]);
内容的提问来源于stack exchange,提问作者Jaroslav Beredi
相关产品推荐
相关产品推荐

