2010-01-31 1 views
2

Я столкнулся с чем-то, что казалось простым раньше, но я снова почесал себе голову. У меня есть таблица для пользователей:MySQL: два внешних ключа в одной таблице, относящихся к другой таблице

user_id (PK) | username| email | something 

... и таблицу для «мнения» для того, когда один пользователь просмотрел другой пользователь:

view_id (PK) | viewer_id | viewed_id | view_date 

«viewer_id» и «viewed_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 
+0

Можете ли вы показать эту часть файла схемы? Возможно, вы не настроили его правильно. –

+0

Добавлен файл схемы. – Tom

ответ

5

И здесь мы идем: Вы указали одинаковые псевдонимы для отношений.

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 

и View должен выглядеть

View: 
    columns: 
    viewed_id: 
     type: integer 
     primary: true 
    viewer_id: 
     type: integer 
     primary: true 

смотрите в документации Doctrine на many-to-many relationships.

+0

Спасибо Феликс, позволь мне попробовать это. – Tom

+0

Исправление Alias ​​в верхней части решает его для меня. Вам нужно потратить немного больше времени на документацию, чтобы правильно ее обвести. Спасибо за вашу помощь! – Tom

+0

Спасибо! это очень помогло мне в моем проекте. – GiantRobot

1

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) 
+0

Спасибо, я думаю, что это сужает его до синтаксиса схемы. – Tom