【问题标题】:DQL join two joined tables from different tablesDQL 连接来自不同表的两个连接表
【发布时间】:2017-05-24 15:30:49
【问题描述】:

我知道标题不是很清楚,但我会尝试在这里更好地解释我的问题。 我有 3 个教义实体: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

【问题讨论】:

    标签: doctrine dql


    【解决方案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();
    

    【讨论】:

    • 这正是我正在寻找的!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2014-10-05
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多