Как правильно прописать связи для объектов?

Добрый день!

Добрался до связей объектов и столкнулся с нестандартной ситуацией.

У меня есть объекты двух классов: Calls и Contractors. Объекты Calls — это обращение (звонок в колл-центр), а Contractors — контрагент (физ. лицо). У одного обращения может быть несколько контрагентов. Тут понятно — связь один ко многим:

...
<composite alias="Contractors" class="Contractors" local="id"
  foreign="call_id" cardinality="many" owner="local" />

...
<aggregate alias="Calls" class="Calls" local="call_id"
  foreign="id" cardinality="one" owner="foreign" />

Но у объекта Calls есть только один основной контрагент. Здесь уже нужна связь один к одному:

...
<composite alias="Contractors" class="Contractors" local="contractor"
  foreign="id" cardinality="one" owner="local" />

...
<aggregate alias="Calls" class="Calls" local="id"
  foreign="contractor" cardinality="one" owner="foreign" />

Отсюда вопрос — как правильно прописать связи, чтобы можно было получать основного контрагента так:
$call->getOne('Contractors');
а всех контрагентов так:
$call->getMany('Contractors');

Или вообще оставить только связь один ко многим и основного контрагента получать так:
$call->getOne('Contractors', array('id' => $call->get('contractor')));
Илья Уткин
06 февраля 2013, 08:09
modx.pro
1 277
0

Комментарии: 3

Евгений Дурягин
06 февраля 2013, 12:40
0
Ну можно прописать связи как Contractor (или даже PrimaryContrator) и Contractors
$call->getOne('PrimaryContractor');
$call->getMany('Contractors');
А вы уверены что composite и aggrеgate правильно прописали? У контрагента может быть несколько обращений или в каждом обращении контрагенты уникальны?
В вашей схеме при удалениии обращения удаляются и все связанные контрагенты.
А при удалении контрагента его обращения не удаляются, что может привести к нарушению целостности данных.
    Илья Уткин
    06 февраля 2013, 13:00
    0
    Вы имеете ввиду, если в XML-схеме для объекта Calls прописать две связи:
    <composite alias="PrimaryContractor" class="Contractors" local="contractor"
      foreign="id" cardinality="one" owner="local" />
    <composite alias="Contractors" class="Contractors" local="id"
      foreign="call_id" cardinality="many" owner="local" />
    то при $call->getOne('PrimaryContractor') будет возвращаться нужный объект?

    А насчет composite и aggrеgate — мне кажется, что правильно прописал: обращение — это основной объект, который просто объединяет всех контрагентов. То есть можно сказать, что обращение — это такой абстрактный клиент, внутри которого может быть несколько клиентов. И действительно, каждый контрагент связан только с одним обращением. И при удалении обращения нужно удалять и его контрагентов, а при удалении контрагента обращение должно остаться (в нем могут быть другие контрагенты).

    Только вот думаю, что буду делать при удалении основного контрагента… Надо будет продумать этот момент и при удалении основного делать основным какой-нибудь из оставшихся контрагентов, а если не осталось, то удалять и обращение.
    Евгений Дурягин
    06 февраля 2013, 13:26
    0
    Вы имеете ввиду, если в XML-схеме для объекта Calls прописать две связи:

    <composite alias=«PrimaryContractor» class=«Contractors» local=«contractor»
    foreign=«id» cardinality=«one» owner=«local» />
    <composite alias=«Contractors» class=«Contractors» local=«id»
    foreign=«call_id» cardinality=«many» owner=«local» />

    то при $call->getOne('PrimaryContractor') будет возвращаться нужный объект?
    Да, по крайней мере теоретически :)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3