В вашей ситуации у вас есть модель 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);
То же самое относится, если вы хотите, чтобы все счета для данного курса.