使用Doctrine2 PHP的两个表之间的双重关联

使用Doctrine2 PHP的两个表之间的双重关联,php,database,postgresql,doctrine-orm,Php,Database,Postgresql,Doctrine Orm,我正在尝试将5个对象与Doctrine2(PHP)关联起来。 我正在使用PostgreSQL 以下是数据库架构: 一个公司可能有许多枢纽,每个枢纽都有一个港口。 一个公司可能有很多行,每行都有一个行列表。 一个列表有两个港口。 例如,行列表是“Los Angeles Seattle”,多亏了行表,多家公司可能拥有它 我试图查询一家公司的所有集线器、港口、线路列表和线路。 我有SQL查询: SELECT * FROM hub h JOIN harbor a ON a.id = h.harbor_

我正在尝试将5个对象与Doctrine2(PHP)关联起来。 我正在使用PostgreSQL

以下是数据库架构:

一个公司可能有许多枢纽,每个枢纽都有一个港口。 一个公司可能有很多行,每行都有一个行列表。 一个列表有两个港口。 例如,行列表是“Los Angeles Seattle”,多亏了行表,多家公司可能拥有它

我试图查询一家公司的所有集线器、港口、线路列表和线路。 我有SQL查询:

SELECT *
FROM hub h
JOIN harbor a
ON a.id = h.harbor_id
JOIN linelist l
ON (l.harborstart_id = a.id OR l.harborend_id = a.id)
JOIN line m
ON m.linelist_id = l.id
WHERE h.company_id = 41
AND m.company_id = 41"
我正试图用DQL做同样的事情。 我试过这个,但不起作用:

$query = $this->getEntityManager()
->createQuery('SELECT h, a, l, m
               FROM AmGameBundle:Hub h
               JOIN h.harbor a
               JOIN a.linelist l
               JOIN l.line m
               WHERE h.company = :company_id
               AND m.company = :company_id')
->setParameter('company_id', $company_id);
因此,我只有与harborstart_id匹配的LineList和Line对象,但我需要与harborstart_id或HarborRend_id匹配的对象

您认为这在DQL中是可能的吗?
对于多对多,最好更改Harbor和Linelist之间的关系?

我认为这是在实体中定义两个从Harbor到Linelist的关系的问题。我想你有点像

<?php
/**
 * @Entity
 * @Table(name="LineList")
 */
class LineList {
    /** 
     * @var object $startHarbor
     * @ManyToOne(targetEntity="Harbor", inversedBy="startHarbors")
     * @JoinColumn(name="harborstart_id", referencedColumnName="id", nullable=FALSE)
     */
    protected $startHarbor;
}

/**
 * @Entity
 * @Table(name="Harbor")
 */
class Harbor {
    /** 
     * @var object $startHarbors
     * @OneToMany(targetEntity="LineList", mappedBy="startHarbor")
     */
    protected $startHarbors;
}

这会让你走上正确的方向。但是,如果它变得麻烦,那么您推测的多对多方法应该是一个有充分证明的解决方案。

我认为这是一个在实体中定义从harbor到linelist的2个关系的问题。我想你有点像

<?php
/**
 * @Entity
 * @Table(name="LineList")
 */
class LineList {
    /** 
     * @var object $startHarbor
     * @ManyToOne(targetEntity="Harbor", inversedBy="startHarbors")
     * @JoinColumn(name="harborstart_id", referencedColumnName="id", nullable=FALSE)
     */
    protected $startHarbor;
}

/**
 * @Entity
 * @Table(name="Harbor")
 */
class Harbor {
    /** 
     * @var object $startHarbors
     * @OneToMany(targetEntity="LineList", mappedBy="startHarbor")
     */
    protected $startHarbors;
}

这会让你走上正确的方向。但是,如果它变得麻烦,您推测的多对多方法应该是一个有充分文档记录的解决方案。

您可能只想直接到多对多,查看此线程:您可能只想直接到多对多,查看此线程:
$query = $this->getEntityManager()
->createQuery('SELECT h, a, sh, eh, m
               FROM AmGameBundle:Hub h
               JOIN h.harbor a
               JOIN a.startHarbors sh
               JOIN a.endHarbors eh
               JOIN l.line m
               WHERE h.company = :company_id
               AND m.company = :company_id')
->setParameter('company_id', $company_id);