首页 > 解决方案 > 使用Doctrine时如何获取join ID?

问题描述

我正在做我公司的一个项目。但是,我对教义并不熟悉。我是老式的查询人。

Table-A 和 Table-B 是一对多的关系,通过 Table-B 上的“a_id”链接起来。在实体 B 中,指定了 $a_name。

表-A

a_id
a_name
a_attr

表-B

b_id
a_id
b_name
b_attr

实体-B

/**
 * @ORM\ManyToOne(targetEntity="EntityA")
 * @ORM\JoinColumn(name="a_id", referencedColumnName="a_id")
 * @var Timezone
 */
protected $a_name;

现在我正在编写一种方法来使用 IN() 获取一组记录

/**
 * @param array $ids
 *
 * @return array
 */
public function getByIds($ids) {
    $query = $this->getEntityManager()->createQuery('SELECT t FROM Entity-B t INDEX BY t.id WHERE t.id IN (:ids)');
}

上面的行“INDEX”和“WHERE”带有Entity-B ID。如何使用实体 A 的 ID(表 B 上的 a_id)“索引”和“位置”?

谢谢。

标签: symfonydoctrine-orm

解决方案


为您的 DQL 试试这个或类似的:

SELECT a.a_id, t.b_id, t.b_name, t.b_attr FROM Entity-B t LEFT JOIN t.a_name a INDEX BY a.id WHERE a.a_id IN (:ids)

我们只需向 Entity-A 添加一个连接,在 select 中包含 a.id,然后按 a.id 进行索引。

当我们在理论中处理实体时,我们需要加入实体以获取其 id,然后按其索引。此外,每个实体中的属性命名可能更简单、更直观。因此,不是 Entity-A (a) 具有属性a_id,a_attr等,而是使用id,attribute等。我假设您只是概括了问题的代码,并且您的项目中可能有更好的属性名称。

让我知道 DQL 如何为您服务。


推荐阅读