我尝试使用innerJoin
构建Doctrine2/QueryBuilder
查询。
$repo = $this->getDoctrine()
->getRepository('MyBundle:Models');
$query = $repo->createQueryBuilder('m')
->where('m.id = :id')
->setParameter('id', $id);
学说说:
连接始终属于from子句的一部分。这就是你的原因 必须指定连接所属的FROM部分的别名 第一个论点。
作为第二个和第三个参数,您可以指定名称和别名 join-table和第四个参数包含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')
?
当它像这样加入时有点混乱。可以请有人向我解释一下吗?
帮助!!
答案 0 :(得分:1)
事实上,你已经在你的innerJoin函数的第二个参数中明确地引用了你的实体phonenumbers。
您阅读了该文档,我将根据您的要求逐点重新阅读:
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为phonenumber以在选择中访问它)
答案 1 :(得分:1)
您正在使用表格进行DQL级别,这意味着您实际加入了一个表,因此您只需要表名,而不是实体名。表“phonenumbers甚至可能没有实体开头,这就是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');