首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用innerJoin的Symfony2 2/Doctrine2 2

使用innerJoin的Symfony2 2/Doctrine2 2
EN

Stack Overflow用户
提问于 2015-11-12 07:48:46
回答 2查看 10.6K关注 0票数 2

我正在尝试使用innerJoin构建一个Doctrine2/QueryBuilder查询。

代码语言:javascript
复制
$repo =  $this->getDoctrine()
        ->getRepository('MyBundle:Models');
$query = $repo->createQueryBuilder('m')
        ->where('m.id = :id')
        ->setParameter('id', $id);

理论上说:

联接始终属于from子句的一个部分。这就是为什么您必须指定联接所属的FROM部分的别名作为第一个参数。 作为第二个和第三个参数,您可以指定连接表的名称和别名,第四个参数包含ON子句。

例如。

代码语言:javascript
复制
$queryBuilder
->innerJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id');

我无法理解的是,'phonenumbers'表引用的是Entity NameDB Table Name

我真正想要的是,是否有任何方法可以显式地引用类似

innerJoin('u', 'MyBundle:phonenumbers', 'p', 'u.id = p.user_id')

当它像这样连接起来的时候,会有点混乱。有人能给我解释一下吗?

救命!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-12 08:22:44

您使用的是DQL级别的表,这意味着您实际上加入了一个表,因此您只需要表名,而不是实体名。表“电话机可能一开始就没有实体,这就是Doctrine请求表名而不是实体名的原因。

编辑

实际上,使用实体名称是可能的(摘自我自己的代码,它是一种魅力):

代码语言:javascript
复制
$builder = $this->createQueryBuilder('m');
$builder->innerJoin(
    'YourBundle:Category',
    'c',
    Join::WITH,
    $builder->expr()->eq('m.id', 'c.mdl_id')
);

要使用Join中的常量,首先应该:

代码语言:javascript
复制
use Doctrine\ORM\Query\Expr\Join;

但这也应该有效(摘自文档,意思是应该像魅力一样发挥作用):

代码语言:javascript
复制
$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

票数 1
EN

Stack Overflow用户

发布于 2015-11-12 08:22:13

事实上,您已经在innerJoin函数的第二个参数中明确引用了实体语音器。

你读了这篇文档,我会用你的请求逐点重来:

  • 参数1: FROM部分的别名,这里是您的m (模型别名)
  • 论点2:要加入模型的实体的全名
  • 论点3:访问它的别名(就像模型的“m”)
  • 论点4:联接条件。(类似于sql请求的ON部分)

但是对于symfony,如果你和你的两个实体有这样的关系:

代码语言:javascript
复制
//AppBundle/Entity/Models

    class Models {
        /**
         * ...
        **/
        private $id;

        /**
         * ...
         * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Phone", inversedBy="models")
         **/
        private $phonenumbers;

        ...
    }

你想加入你就能做到:

代码语言:javascript
复制
$repo =  $this->getDoctrine()
        ->getRepository('MyBundle:Models');
$query = $repo->createQueryBuilder('m')
        ->innerJoin('m.phonenumbers', 'p')
        ->where('m.id = :id')
        ->setParameter('id', $id);

要解释这一点:您只需传递作为第一个参数的实体属性(这里是您的模型的电话号码),并将其定义为别名(p表示在select中访问它的电话号码)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33666539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档