Как правильно прописать связи для объектов?
Добрый день!
Добрался до связей объектов и столкнулся с нестандартной ситуацией.
У меня есть объекты двух классов: Calls и Contractors. Объекты Calls — это обращение (звонок в колл-центр), а Contractors — контрагент (физ. лицо). У одного обращения может быть несколько контрагентов. Тут понятно — связь один ко многим:
Но у объекта Calls есть только один основной контрагент. Здесь уже нужна связь один к одному:
Отсюда вопрос — как правильно прописать связи, чтобы можно было получать основного контрагента так:
Или вообще оставить только связь один ко многим и основного контрагента получать так:
Добрался до связей объектов и столкнулся с нестандартной ситуацией.
У меня есть объекты двух классов: 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')));
Комментарии: 3
Ну можно прописать связи как Contractor (или даже PrimaryContrator) и Contractors
В вашей схеме при удалениии обращения удаляются и все связанные контрагенты.
А при удалении контрагента его обращения не удаляются, что может привести к нарушению целостности данных.
$call->getOne('PrimaryContractor');
$call->getMany('Contractors');
А вы уверены что composite и aggrеgate правильно прописали? У контрагента может быть несколько обращений или в каждом обращении контрагенты уникальны?В вашей схеме при удалениии обращения удаляются и все связанные контрагенты.
А при удалении контрагента его обращения не удаляются, что может привести к нарушению целостности данных.
Вы имеете ввиду, если в XML-схеме для объекта Calls прописать две связи:
А насчет composite и aggrеgate — мне кажется, что правильно прописал: обращение — это основной объект, который просто объединяет всех контрагентов. То есть можно сказать, что обращение — это такой абстрактный клиент, внутри которого может быть несколько клиентов. И действительно, каждый контрагент связан только с одним обращением. И при удалении обращения нужно удалять и его контрагентов, а при удалении контрагента обращение должно остаться (в нем могут быть другие контрагенты).
Только вот думаю, что буду делать при удалении основного контрагента… Надо будет продумать этот момент и при удалении основного делать основным какой-нибудь из оставшихся контрагентов, а если не осталось, то удалять и обращение.
<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 — мне кажется, что правильно прописал: обращение — это основной объект, который просто объединяет всех контрагентов. То есть можно сказать, что обращение — это такой абстрактный клиент, внутри которого может быть несколько клиентов. И действительно, каждый контрагент связан только с одним обращением. И при удалении обращения нужно удалять и его контрагентов, а при удалении контрагента обращение должно остаться (в нем могут быть другие контрагенты).
Только вот думаю, что буду делать при удалении основного контрагента… Надо будет продумать этот момент и при удалении основного делать основным какой-нибудь из оставшихся контрагентов, а если не осталось, то удалять и обращение.
Вы имеете ввиду, если в 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') будет возвращаться нужный объект?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.