У меня есть несколько таблиц в моей системе:
news --id --title --content video --id --title --url album --id --title
Теперь мне нужно сделать многозначное отношение к этим таблицам, но гибким способом. Я создал таблицу под названием «ссылки» с приведенной ниже структурой:
links --parent_entity (example: news) --parent_id (example: 5) --child_entity (exmaple: video) --child_id (example: 2)
Как я могу сопоставить это с помощью Доктрины?
Это невозможно, потому что вы не можете выполнить надлежащее соединение. Присоединение в этом случае будет зависеть от значения parent_entity и child_entity (т. Е. Каждая строка может потребоваться присоединиться к другой таблице). Кроме того, как доктрина будет знать, какой тип записи гидратируется (т. Е. Потому что она зависит от типа сущности).
Вы можете вытащить что-то вроде этого (хотя это будет странно), используя предложение WITH в ваших соединениях. Например, в методе setUp () вашей модели новостей вы можете:
$this->hasMany('Links as NewsVideoLinks', array('local' => 'id', 'foreign' => 'parent_id'));
И в настройке вашей модели ссылок:
$this->hasMany('Videos as videos', array('local' => 'child_id', 'foreign' => 'id'));
Вам нужно будет определить все комбинации объединений в модели Links. Я имею в виду, что вам нужно будет сказать, что у него много новостей и альбомов, а также с помощью child_id и parent_id.
И затем в вашем запросе вам нужно будет сделать что-то вроде:
$query = Doctrine_Query::create(); $query->from('News n'); $query->innerJoin("n.NewsVideoLinks as links WITH parent_entity = 'news'"); $query->innerJoin("links.Videos as vids WITH child_entity = 'videos'"); $results = $query->execute();
Как вы можете видеть, это очень громоздко. Я бы очень рекомендовал создавать таблицы соединений для каждого отношения. Вы все равно получите то, что ищете, присоединившись к каждой таблице соединений.
Документация Доктрины неплохая. Я не совсем уверен, что вы подразумеваете под «гибкой», но вот пример конфигурации ямля для отношений « многие-ко-многим» для Doctrine версии 1.2.
--- User: columns: id: type: integer(4) autoincrement: true primary: true username: type: string(255) password: type: string(255) attributes: export: all validate: true Group: tableName: group_table columns: id: type: integer(4) autoincrement: true primary: true name: type: string(255) relations: Users: foreignAlias: Groups class: User refClass: GroupUser GroupUser: columns: group_id: type: integer(4) primary: true user_id: type: integer(4) primary: true relations: Group: foreignAlias: GroupUsers User: foreignAlias: GroupUsers
Если я правильно понимаю ваш макет базы данных, «parent_entity» и «child_entity» представляют таблицу, к которой вы хотите привязать идентификатор.
Это «технически» некорректная структура базы данных (см. Нормализацию базы данных ), так как вы не можете сопоставить эти столбцы с любым другим столбцом отдельной таблицы. В принципе, вы не можете использовать столбцы id сейчас, так как это неоднозначно.
Я думаю, что вам нужно переосмыслить свою логику базы данных, тогда было бы легче писать пароли кода.