Отношения Codeigniter Datamapper «многие ко многим»

Я устанавливаю отношения в своих моделях с помощью DataMapper, но упираюсь в стену.

У меня есть класс RealEstate, класс Client и класс Position, все из которых имеют отношения «многие ко многим».

  1. Client может иметь Position «покупателя» в RealEstate
  2. Тот же Client может иметь Position «продавца» в другом RealEstate

Таким образом, для данного RealEstate легко найти все связанные с ним Clients, но как я могу также включить то, что Position есть у этих клиентов для конкретного RealEstate?


person Simon    schedule 30.03.2012    source источник


Ответы (1)


Я думаю, что у вас есть неправильный дизайн для него. Между Client и Position действительно должна быть связь "многие ко многим", но только связь "один ко многим" между Position и RealEstate, с one на стороне RealEstate. Он эффективно эмулирует отношения «многие ко многим» между RealEstate и Client, которые содержат дополнительную информацию (Position).

Говоря с точки зрения проблемной области, любая роль (Position) привязана к конкретному RealEstate, но любой Client может иметь произвольное количество ролей, а любой RealEstate может (?) иметь несколько ролей, прикрепленных к нему.

У меня нет под рукой CodeIgniter 2, поэтому я не могу предоставить образцы кода, но дайте мне знать, если вам это действительно нужно - у меня есть CodeIgniter 2 дома.

person J0HN    schedule 30.03.2012
comment
Итак, у меня есть класс RealEstate, класс Position и класс Client. К объекту RealEstate прикреплено несколько позиций (вы можете рассматривать их как группы. Эти позиции содержат клиентов. Например, в RealEstate APPARTMENT1 клиент John Doe находится в позиции владельца. Но он может быть в другой позиции для другой недвижимости! В моей базе данных есть - RealEstates - Clients - Positions - Clients_Positions (многие ко многим) - Positions_RealEstates (один ко многим) Как я могу получить всех клиентов, у которых есть позиция в данном RealEstate.Должна ли также быть таблица Clients_RealEstates? - person Simon; 31.03.2012
comment
Я так не думаю. Необработанный запрос выглядит примерно так: select * from clients c join clients_positions cp where cp.estate_id = $estate_id. Я не знаком с CI DataMapper lib, поэтому не могу не преобразовать этот запрос в код DataMapper, извините. :) - person J0HN; 01.04.2012
comment
Привет @ J0HN, мне удалось исправить это самому. Поэтому я нормализовал отношения «многие ко многим» к отношениям «один ко многим» между Клиентом и Контрактом, Собственностью и Контрактом, Позицией и Контрактом. Таблица и модель Contract имеют идентификаторы/внешние ключи всех других объектов и знают, какие из них подключены. Спасибо за ваш вклад! - person Simon; 01.04.2012