如何使用3个PrimaryKey编写文件yml多对多表

时间:2011-11-02 16:44:45

标签: php orm doctrine yaml doctrine-1.2

如果我们的情况是标准视图,您有两个表格和三元组,并且可以通过following documentation

轻松管理

但是如果我们有三个而不是两个表,然后三元组由3个PrimaryKey组成,那么当我写yml文件时?

情况示例:

以我有一个参与课程的用户为例。 所以我有一个users表,courses表和一个users_has_courses(useri_id,course_id)。 这是多对多的标准情况。 但我也有一个表invoices,因此有一个表users_courses_invoices,其中有三个primaykey(user_id,course_id,invoice_id)。

1 个答案:

答案 0 :(得分:1)

在您的情况下,您拥有UserCourse模型,并且它们与多对多关系相关联,并将(user_id, course_id)对作为关键字。我会调用这个模型订阅,并给它自己的标识符,然后我将这个模型与Invoice模型链接,所以你的最终方案(最小版本)可能是:

User:
  columns:
    id:
      type: integer
      primary: true

Course:
  columns:
    id:
      type: integer
      primary: true

Subscription:
  columns:
    id:
      type: integer
      primary: true
    user_id:
      type: integer
      notnull: true
    course_id:
      type: integer
      notnull: true
  relations:
    User:
      foreignAlias: Subscriptions
    Course:
      foreignAlias: Subscriptions

Invoice:
  columns:
    id:
      type: integer
      primary: true
    subscription_id:
      type: integer
      notnull: true
  relations:
    Subscription:
      foreignAlias: Subscription
      foreignType: One

通过这种方式,您拥有一个规范化的数据库,您可以使用以下代码访问用户和课程的发票:

$user->Subscriptions->getFirst()->Invoice
$course->Subscriptions->getFirst()->Invoice

如果您想要给定用户的所有发票,您可以通过这种方式进行查询

InvoiceTable::getInstance()->createQuery('i')
    ->select('i.*')
    ->leftJoin('i.Subscription s')->leftJoin('s.User u')
    ->where('u.id = ?', $user_id);

如果您想要特定课程的所有发票,同样适用。