Doctrine覆盖关系访问器

时间:2011-05-21 11:15:10

标签: php symfony1 doctrine

假设您有以下关系(为简单起见而改动):

Dog:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true }

AwardType:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true }

Award:
  columns:
    dog_id:     { type: integer, notnull: true, primary: true }
    award_id:   { type: integer, notnull: true, primary: true }
    is_granted: { type: boolean, notnull: true, default: false }
  relations:
    Dog:
      local:        dog_id
      foreign:      id
      type:         one
      foreignType:  many
      foreignAlias: Awards
    AwardType:
      local:        award_id
      foreign:      id
      type:         one
      foreignType:  many
      foreignAlias: Awards

通过上述设置,我可以添加一只新狗并手动为该狗添加奖励。我也可以编辑已授予狗的奖励。

当我调用$ myDog-> getAwards()时,我希望该套件包含所有授予的奖励(Award.is_granted == true&& Award.dog_id == $ myDog() - > getId())获得尚未授予那只狗的所有奖项。

是否有可以在某个模型中设置的选项来实现这一目标?如果没有,那么实现它的最佳方法是什么?

我正在使用Symfony 1.4和捆绑的Doctrine 1.2 ORM。

[编辑1]
我意识到我没有正确地解释整个奖项,所以我会尝试扩展它。假设您有以下奖励类型:

  • 1:骨头没有猥亵邮递员
  • 2:衣领不咬小姐莫莉
  • 3:追逐送牛奶的大骨头(我们都知道是邪恶的)

Dog1已经注册,并且已被授予AwardTypes 1和3.当编辑该Dog时,表单应显示带有选中复选框的AwardTypes 1和3以及带有未选中复选框的AwardType 2。如果Dog 1在Award表中为每个AwardTypes都有一个条目,那么这很有用。两个is_granted == true和一个is_granted == false。到目前为止一切都很好。

当用户输入新的Dog时,表单应显示所有AwardTypes,但没有选中复选框。保存新Dog时,Award表中应显示总共3行,并根据复选框的选中状态设置is_granted-flag。

我知道我可以获得所有奖励类型并检查奖项类型已经授予狗已经被授予(显示所有未经检查的新狗,被授予检查+尚未被授予现有狗的未经检查)。我在这里问的问题是不是教条有一些神奇的东西会给我如上所述的复合集。

2 个答案:

答案 0 :(得分:1)

好的,您在建模数据时遇到了问题。它应该看起来像这样:

Dog:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true, unique: true }
  relations:
    Awards:
      class: Award
      foreignType: many
      type: many
      refClass: DogAward
      local: dog_id
      foreign: award_id

Award:
  columns:
    id:         { type: integer, notnull: true, primary: true }
    name:       { type: string,  notnull: true, unique: true }

DogAward:
  columns:
    dog_id:     { type: integer, notnull: true, primary: true }
    award_id:   { type: integer, notnull: true, primary: true }

我使用了多对多关系,并添加了一些我认为在您的情况下可能有用的约束。 Symfony应该生成一个看起来像你想要的形式,告诉我们是不是这样。

答案 1 :(得分:0)

您可以覆盖lib / model / Dog.class.php中的方法getAwards()方法

例如

public function getAwards(){
  return $query = $this->getTable()
    ->createQuery('a')
    ->where('a.dog_id = ?', $this->getId())
    ->addWhere('a.is_granted = ?', true);
    ->execute();
}

请注意,那只是一个模型,我现在没有测试