【发布时间】:2019-08-16 15:23:33
【问题描述】:
为简单起见,让 Symfony 中有 2 个实体。第一个称为Job,第二个称为Field(Job 的类别)。每个作业可以属于多个领域。 Job 知道它的字段,而 Field 实体对作业一无所知。
// Job.php
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Field")
* @ORM\JoinTable(name="job_to_fields",
* joinColumns={@ORM\JoinColumn(name="job_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="field_id", referencedColumnName="id")}
* )
*/
private $fields;
当我们要加载字段 [1, 2, 3] 的所有作业时,我希望类似
SELECT j.*
FROM job j
INNER JOIN job_to_fields jtf ON j.id = jtf.job_id
WHERE /* some other parameters */jtf.field_id IN (1, 2, 3)
实际上 Doctrine 构造了这个 SQL 语句:
SELECT j.*
FROM job j
INNER JOIN job_to_fields jtf ON j.id = jtf.job_id
INNER JOIN field f ON f.id = jtf.field_id
WHERE /* some other parameters */f.id IN (1, 2, 3)
第二个连接(到field 表)是不必要的。有没有办法删除这个/告诉教义不要这样做?
理论上,Doctrine 应该知道 f.id 和 jtf.field_id 的关系,因为它在连接中使用它们。
【问题讨论】:
标签: symfony join doctrine-orm doctrine query-optimization