DQL 连接来自不同表的两个连接表
DQL join two joined tables from different tables
我知道标题不是很清楚,但我会尽量在这里更好地解释我的问题。
我有 3 个学说实体:A、B 和 C
class A { class B { class C {
$id; $id; $id;
ManyToMany ManyToMany }
$C; $C;
} }
我想知道 object A 和 object B 是否至少有一个相同的 C。
多对多关系让我 table 喜欢 :
table AC { table BC {
A_id; B_id;
C_id; C_id;
} }
我知道我不能在 DQL 中使用这些 table,但是我想做的可以在 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
您将需要使多对多关联成为双向的,因此实体将如下所示:
<?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 class:
$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();
我知道标题不是很清楚,但我会尽量在这里更好地解释我的问题。 我有 3 个学说实体:A、B 和 C
class A { class B { class C {
$id; $id; $id;
ManyToMany ManyToMany }
$C; $C;
} }
我想知道 object A 和 object B 是否至少有一个相同的 C。
多对多关系让我 table 喜欢 :
table AC { table BC {
A_id; B_id;
C_id; C_id;
} }
我知道我不能在 DQL 中使用这些 table,但是我想做的可以在 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
您将需要使多对多关联成为双向的,因此实体将如下所示:
<?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 class:
$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();