DQL连接来自不同表的两个连接表

时间:2017-05-24 15:30:50

标签: doctrine dql

我知道标题不是很清楚,但我会尽力在这里更好地解释我的问题。 我有3个Doctrine实体:A,B和C

class A {        class B {            class C {
  $id;             $id;                 $id;
  ManyToMany       ManyToMany         }
  $C;              $C; 
}                }

我试图知道对象A和对象B是否至少有一个相同的C.

许多关系给了我一样的表:

table AC {          table BC {
   A_id;               B_id;
   C_id;               C_id;
}                    }

我知道我不能在DQL中使用这些表,但我想要做的就是在SQL中完成。它会给:

SELECT COUNT(A.id) FROM AC INNER JOIN BC 
ON AC.C_id = BC.C_id
WHERE BC.B_id=1217 AND AC.A_id=185

1 个答案:

答案 0 :(得分:1)

您需要双向进行多对多的协调,因此实体将如下所示:

<?php

namespace App\Model;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class A
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @var integer
     */
    private $id;

    /**
     * @var ArrayCollection|C[]
     * @ORM\ManyToMany(targetEntity="C", inversedBy="as")
     */
    private $cs;
}

/**
 * @ORM\Entity
 */
class B
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @var integer
     */
    private $id;

    /**
     * @var ArrayCollection|C[]
     * @ORM\ManyToMany(targetEntity="C", inversedBy="bs")
     */
    private $cs;
}

/**
 * @ORM\Entity
 */
class C
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @var integer
     */
    private $id;

    /**
     * @var ArrayCollection|A[]
     * @ORM\ManyToMany(targetEntity="A", mappedBy="cs")
     */
    private $as;

    /**
     * @var ArrayCollection|A[]
     * @ORM\ManyToMany(targetEntity="B", mappedBy="cs")
     */
    private $bs;

}

然后你可以通过这个DQL查询在A和B实体上用条件连接查询C类:

    $query = $this->entityManager->createQuery("SELECT count(c.id) FROM C::class c INNER JOIN c.as a WITH a.id = :a_id INNER JOIN c.bs b WITH b.id = :b_id")
        ->setParameter('a_id', 185)
        ->setParameter('b_id', 1217);
    $result = $query->getSingleScalarResult();