我之前遇到过一些看起来很简单的事情,但让我再次摸不着头脑。我有一个供用户使用的表格:
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行为,Doctrine中的问题,还是我接近这个问题的方式存在问题,或者没什么可担心的!一个表中是否有两个单独的外键映射到另一个表中的同一列?它是否合乎逻辑,因为JOIN仍然允许我通过user_id访问“视图”?我弄错了吗?
感谢您的时间。
编辑 - 架构文件:
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 :(得分: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
请参阅many-to-many relationships上的Doctrine文档。
答案 1 :(得分:1)
Mysql允许同一个表上的多个外键,甚至是另一个表中的同一列,但我不知道为什么doctrine只创建其中一个:
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)