DQL - 获取相关实体
Posted
技术标签:
【中文标题】DQL - 获取相关实体【英文标题】:DQL - fetching related entities 【发布时间】:2011-05-04 23:21:08 【问题描述】:通常我只会延迟加载我的实体,但现在我需要创建一个能够将节点作为数组获取的 DQL。我已经尝试了几个查询,但我无法让它工作,下面是两个例子:
// example one
$this->em->createQuery('SELECT n FROM Entities\Node n WHERE n.nodeType INSTANCE OF ?1')
->setParameter(1, $type)->getArrayResult();
// example two
$this->em->createQuery('SELECT n FROM Entities\Node n WHERE n.nodeType_id = ?1')
->setParameter(1, $type->id)->getArrayResult();
我不确定 INSTANCE OF 实际做了什么,但它不起作用,使用 nodeType_id 也不起作用,因为我的注释没有 nodeType_id 只有数据库表有。
那么什么是正确的方法呢?
【问题讨论】:
【参考方案1】:什么是节点类型?如果它只是一个字符串,那么你只需要:
$this->em
->createQuery('SELECT n FROM Entities\Node n WHERE n.nodeType = ?1')
->setParameter(1, $type)
->getArrayResult();
如果您使用继承并且想要特定类型的节点,请使用:
$this->em
->createQuery("SELECT n FROM Entities\Node n WHERE n INSTANCE OF $type")
->getArrayResult();
注意 $type 应该类似于:$type = 'Entities\Nodes\NodeSubclass'
。不能作为参数添加。
【讨论】:
NodeType 是另一个实体,我在 node 和 nodeType 之间有一个多对一关系【参考方案2】:我只需要像这样使用等号:
$this->em->createQuery('SELECT n FROM Entities\Node n WHERE n.nodeType = ?1')
->setParameter(1, $type->id)->getArrayResult();
其中 type 是另一个实体。
【讨论】:
如果您的答案有效 - 太好了!如果您需要 nodeType 上的其他条件,那么更一般的情况是使用连接:'SELECT n FROM Entities\Node n JOIN n.nodeType nt WHERE nt.id = ?1' and nt.someOtherProperty = ?2'
以上是关于DQL - 获取相关实体的主要内容,如果未能解决你的问题,请参考以下文章
如何使用实体框架和 MySQL 获取每个组的最新记录,包括相关实体