使用QueryBuilder

时间:2015-11-12 07:48:46

标签: php mysql symfony doctrine-orm

我尝试使用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 NameDB Table Name

我真正想要的是,有没有办法明确地引用像

这样的实体

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

当它像这样加入时有点混乱。可以请有人向我解释一下吗?

帮助!!

2 个答案:

答案 0 :(得分:1)

事实上,你已经在你的innerJoin函数的第二个参数中明确地引用了你的实体phonenumbers。

您阅读了该文档,我将根据您的要求逐点重新阅读:

  • 参数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以在选择中访问它)

答案 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');

采取以下形式:http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/query-builder.html#join-clauses