/** * Обновление связи many_to_many в бд * * @param array $aRelation Соответствующий связи элемент массива из $oEntityORM->aRelations * @param array $aRelationData Соответствующий связи элемент массива из $oEntityORM->aRelationsData * @param int $iEntityId Id сущности, для которой обновляются связи */ protected function _updateManyToManySet($aRelation, $aRelationData, $iEntityId) { /* * Описание параметров связи many_to_many * Для примера возьмём такую связь в сущности $oTopic * 'tags' => array(self::RELATION_TYPE_MANY_TO_MANY,'ModuleTopic_EntityTag', 'tag_id', 'db.table.topic_tag_rel', 'topic_id'), * И используется таблица связи * table prefix_topic_tag_rel * topic_id | ефп_id * Тогда тут * [0] -> self::RELATION_TYPE_MANY_TO_MANY - тип связи * [1] -> 'ModuleTopic_EntityTag' - имя сущности объектов связи * [2] -> 'tag_id' - названия столбца в таблице связи, в котором содержатся id объектов связи, в нашем случае тегов. * [3] -> 'db.table.topic_tag_rel' - алиас (идентификатор из конфига) таблицы связи. * Обратите внмание на то, что ORM для определения таблиц сущностей использует модуль и название сущности, то есть * если мы захотим таблицу связи назвать prefix_topic_tag, что, в общем-то, логично, то будет конфликт имён, потому что * ModuleTopic_EntityTag также преобразуется в prefix_topic_tag. * Поэтому необходимо следить за корректным именованием таблиц (точнее алиасов в конфиге, сами таблицы в бд могут * называться как угодно). В данном примере используется суффикс '_rel'. * [4] -> 'topic_id' - название столбца в таблице связи, в котором содержатся id сущности, для которой объявляется связь, * в нашем случае топиков */ $aSavedSet = $this->oMapper->getManyToManySet($aRelation[3], $aRelation[4], $iEntityId, $aRelation[2]); $aCurrentSet = array(); foreach ($aRelationData as $oEntity) { $aCurrentSet[] = $oEntity->getProp($oEntity->_getPrimaryKey()); } if ($aSavedSet == $aCurrentSet) { return; } $aInsertSet = array_diff($aCurrentSet, $aSavedSet); $aDeleteSet = array_diff($aSavedSet, $aCurrentSet); $this->oMapper->updateManyToManySet($aRelation[3], $aRelation[4], $iEntityId, $aRelation[2], $aInsertSet, $aDeleteSet); }