【问题标题】:Symfony2/Doctrine2 innerJoin using QueryBuilderSymfony2/Doctrine2 innerJoin 使用 QueryBuilder
【发布时间】:2015-11-12 07:48:46
【问题描述】:

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

$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 NameDB Table Name

我真正想要的是,有没有办法明确引用实体,如

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

像这样加入的时候有点混乱。谁能给我解释一下?

救命!!

【问题讨论】:

    标签: php mysql symfony doctrine-orm


    【解决方案1】:

    您正在处理具有表的 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

    【讨论】:

    • 如何为SELECT m.id, m.name, c.name FROM models AS m INNER JOIN categories AS c ON (m.id = c.mdl_id) WHERE c.id = ? 编写 DQL?
    • 我更新了我的答案,因为它并不完全正确。从您的 ModelRepository(奇怪的名称 tbh)中运行它。
    • 谢谢。我已经解决了。我实际上正在寻找的是:在 2.4 版之前,没有关联的实体之间的连接是不可能的,您可以使用以下语法生成任意连接: SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email 这在 queryBuilder 中也是可能的。我有两个没有关联的实体,令我困惑的是 Doctrine 如何确定要加入哪个表。我的错。
    【解决方案2】:

    事实上,您已经在 innerJoin 函数的第二个参数中明确引用了实体电话号码。

    您阅读了该文档,我会根据您的要求逐点重新获取它:

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

    但是对于 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 以在选择中访问它)

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 2014-10-23
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多