Как написать файл yml таблица «многие ко многим» с помощью 3 PrimaryKey - PullRequest
1 голос
/ 02 ноября 2011

, если в нашей ситуации стандартное представление, где у вас есть две таблицы и троичная, и им легко управлять, следуя следующей документации

Но если у нас есть три таблицы вместо двух, а троичная состоит из 3 PrimaryKey, как я пишу свои файлы yml?

Пример к ситуации:

Возьмите случай, когда у меня есть пользователь, который участвует в курсе. Итак, у меня есть таблица users, таблица courses и users_has_courses (useri_id, course_id). Это стандартный случай «многие ко многим». Но у меня также есть таблица invoices и, следовательно, таблица users_courses_invoices, где есть три primaykey (user_id, course_id, invoice_id).

1 Ответ

1 голос
/ 04 ноября 2011

В вашей ситуации у вас есть модель User и Course, и они связаны отношением "многие ко многим", в котором ключом является пара (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);

То же самое относится, если вы хотите, чтобы все счета для данного курса.

...