我正在尝试使用innerJoin构建一个Doctrine2/QueryBuilder查询。
$repo = $this->getDoctrine()
->getRepository('MyBundle:Models');
$query = $repo->createQueryBuilder('m')
->where('m.id = :id')
->setParameter('id', $id);理论上说:
联接始终属于from子句的一个部分。这就是为什么您必须指定联接所属的FROM部分的别名作为第一个参数。 作为第二个和第三个参数,您可以指定连接表的名称和别名,第四个参数包含ON子句。
例如。
$queryBuilder
->innerJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id');我无法理解的是,'phonenumbers'表引用的是Entity Name或DB Table Name。
我真正想要的是,是否有任何方法可以显式地引用类似
innerJoin('u', 'MyBundle:phonenumbers', 'p', 'u.id = p.user_id')
当它像这样连接起来的时候,会有点混乱。有人能给我解释一下吗?
救命!!
发布于 2015-11-12 08:22:44
您使用的是DQL级别的表,这意味着您实际上加入了一个表,因此您只需要表名,而不是实体名。表“电话机可能一开始就没有实体,这就是Doctrine请求表名而不是实体名的原因。
编辑
实际上,使用实体名称是可能的(摘自我自己的代码,它是一种魅力):
$builder = $this->createQueryBuilder('m');
$builder->innerJoin(
'YourBundle:Category',
'c',
Join::WITH,
$builder->expr()->eq('m.id', 'c.mdl_id')
);要使用Join中的常量,首先应该:
use Doctrine\ORM\Query\Expr\Join;但这也应该有效(摘自文档,意思是应该像魅力一样发挥作用):
$queryBuilder
->select('id', 'name')
->from('users', 'u')
->innerJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id');这是形式:http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/query-builder.html#join-clauses
发布于 2015-11-12 08:22:13
事实上,您已经在innerJoin函数的第二个参数中明确引用了实体语音器。
你读了这篇文档,我会用你的请求逐点重来:
m (模型别名)但是对于symfony,如果你和你的两个实体有这样的关系:
//AppBundle/Entity/Models
class Models {
/**
* ...
**/
private $id;
/**
* ...
* @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Phone", inversedBy="models")
**/
private $phonenumbers;
...
}你想加入你就能做到:
$repo = $this->getDoctrine()
->getRepository('MyBundle:Models');
$query = $repo->createQueryBuilder('m')
->innerJoin('m.phonenumbers', 'p')
->where('m.id = :id')
->setParameter('id', $id);要解释这一点:您只需传递作为第一个参数的实体属性(这里是您的模型的电话号码),并将其定义为别名(p表示在select中访问它的电话号码)。
https://stackoverflow.com/questions/33666539
复制相似问题