Я столкнулся с чем-то, что казалось простым, но я снова почесал себе голову. У меня есть таблица для пользователей:
user_id (PK) | username| email | something
… и таблицу для «просмотров», когда один пользователь просмотрел другого пользователя:
view_id (PK) | viewer_id | viewed_id | view_date
«Viewer_id» и «view_id» – это и user_ids, что позволяет мне искать отдельно для экземпляров, когда пользователь был зрителем или просматриваемым.
Первоначально я думал, что оба эти столбца будут внешними ключами, но создав таблицы в моем файле schema.yml (я использую Doctrine 1.2) и задал два отдельных внешних отношения (по одному для каждого столбца), кажется, что Doctrine принимает только с учетом первого зарегистрированного внешнего отношения между этими двумя таблицами (user_id> viewer_id).
Теперь я запутался, правильно ли это поведение MySQL, проблема в Доктрине или проблема в том, как я приближаюсь к этому, или не о чем беспокоиться! Может ли быть два отдельных внешних ключа из одной таблицы, сопоставленной с тем же столбцом в другой таблице? Это даже логично, учитывая, что JOIN все равно предоставит мне доступ к «представлениям» через user_id? У меня это неправильно?
Спасибо за ваше время.
EDIT – файл схемы:
User: relations: View: {class: View, local: user_id, foreign: viewer_id, type: many, foreignType: one, alias: View, foreignAlias: User} View: {class: View, local: user_id, foreign: viewed_id, type: many, foreignType: one, alias: View, foreignAlias: User} ... only difference is viewer_id/viewed_id
И вот мы идем: вы указали те же самые псевдонимы для отношений.
User: relations: viewed_by: class: View local: user_id foreign: viewed_id type: many foreignType: one foreignAlias: viewed viewed: class: View local: user_id foreign: viewer_id type: many foreignType: one foreignAlias: viewer
КоличествоUser: relations: viewed_by: class: View local: user_id foreign: viewed_id type: many foreignType: one foreignAlias: viewed viewed: class: View local: user_id foreign: viewer_id type: many foreignType: one foreignAlias: viewer
Или вы установили отношение «все-ко-многим» по-разному:
User: relations: viewed_by: class: User local: viewed_id foreign: viewer_id, refClass: View viewed: class: User local:viewer_id foreign: viewed_id refClass: View
КоличествоUser: relations: viewed_by: class: User local: viewed_id foreign: viewer_id, refClass: View viewed: class: User local:viewer_id foreign: viewed_id refClass: View
и View
должен выглядеть так:
View: columns: viewed_id: type: integer primary: true viewer_id: type: integer primary: true
См. Документацию Doctrine по отношениям « многие ко многим» .
Mysql позволяет использовать несколько внешних ключей в одной таблице, даже в том же столбце в другой таблице, но я не могу сказать, почему доктрина создает только один из них:
mysql> CREATE TABLE test1 (id INT); Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE test3 (ref1 INT, ref2 INT, FOREIGN KEY (ref1) REFERENCES test1(id), FOREIGN KEY (ref2) REFERENCES test1(id)); Query OK, 0 rows affected (0.01 sec)