Doctrine / Symfony - 同一模型上的多个一对多关系

时间:2011-06-09 21:48:43

标签: php doctrine one-to-many

以下是我实际拥有的模式的摘录

Software:
  columns:
    title:
      type: string(255)
    id_publisher:
      type: integer
    id_developper:
      type: integer

Company:
  columns:
    name:
      type: string(255)
    nationality:
      type: string(255)

如您所见,我的软件模型有两个外部引用:publisher和developper。我希望为这两个参考文献中的每一个创建一对多的关系。问题是他们都是公司。

我首先在我的软件模型上尝试了如下所示的内容,但该关系仅适用于第一个本地引用id_publisher。

relations:
  Company:
    type: one
    foreignType: many
    local: [id_publisher, id_developper]
    foreign: id

然后我尝试了(总是在软件模型上):

relations:
  Publisher:
    class: Company
    type: one
    foreignType: many
    local: id_publisher
    foreign: id
  Developper:
    class: Company
    type: one
    foreignType: many
    local: id_developper
    foreign: id

但是,当我执行一个查询计算链接到公司的软件数量的查询时......

public function findAllQuery(Doctrine_Query $q = null) {
    $q = Doctrine_Query::create()
                    ->select('c.*, COUNT(s.id) AS count_software')
                    ->from('Company c')
                    ->leftJoin('c.Software s')
                    ->groupBy('c.id');

    return $q;
}

...只有发布商才会在COUNT子句中考虑。

所以最后,我的问题是,如何处理同一模型的多个一对多关系? 谢谢你的时间!

1 个答案:

答案 0 :(得分:3)

也许你应该尝试添加一个外来别名来告诉doctrine在触发查询时要处理哪个关系:

relations:
  Publisher:
    class: Company
    type: one
    foreignType: many
    foreignAlias: PublishedSoftware
    local: id_publisher
    foreign: id
  Developer:
    class: Company
    type: one
    foreignType: many
    foreignAlias: DevelopedSoftware
    local: id_developer
    foreign: id

在您的查询中,您必须加入两个关系并总结各个计数:

$q = Doctrine_Query::create()
     ->select('c.*, COUNT(ps.id)+COUNT(ds.id) AS count_software')
     ->from('Company c')
     ->leftJoin('c.PublishedSoftware ps')
     ->leftJoin('c.DevelopedSoftware ds')
     ->groupBy('c.id')
 ;

原则默认是使用模型名称作为关系的标识符,因此如果对同一个模型使用多个关系,那么你真的应该重命名至少一个,让doctrine现在就是你的意思。如果没有这个,您将无法像这样检索已发布软件的集合:

$pubSoftware = $myCompany->getPublishedSoftware();
$devSoftware = $myCompany->getDevelopedSoftware();

Doctrine不具备的功能(IMHO)是将两种关系视为同一模型。所以打个电话:

$allSoftware = $myCompany->getSoftware();

不会检索多关系模型上的所有相关软件,而只检索可以通过名为Software的关系检索的软件。

希望有所帮助,

~~~干杯。