我正在尝试使用Doctrine(PHP)对两个对象进行关联。
我有两个对象:用户和对话
一个用户有很多对话,对话最多属于两个用户(对话的发起人和一个接收者)。
所以,在我的Doctrine课程中,我在Conversation类中有这个:
$this->hasOne('User as Initiator', array('local' => 'initiator_id', 'foreign' => 'id'));
$this->hasOne('User as Responder', array('local' => 'responder_id', 'foreign' => 'id'));
在User类中:
$this->hasMany('Conversation as Conversations', array('local'=> 'id', 'foreign'=> ????));
对于这个外键,我想提出一些意思是“initiator_id或responder_id”。
我想我需要一个联结表来完成我想做的事情?在这种情况下你会做什么?
感谢您的回答,
马丁
答案 0 :(得分:1)
我猜是这样的:
$this->hasMany('Conversation as Initiations', array('local'=> 'id', 'foreign'=> 'initiator_id'));
$this->hasMany('Conversation as Responses', array('local'=> 'id', 'foreign'=> 'responder_id'));
答案 1 :(得分:0)
我认为最好将Conversation
和User
表之间的关系重新建模为多种方式。因为即使一个对话只有2个用户,它们仍被认为不止一个。
在之前的解决方案中,拥有两个与同一个表(对话)的多个关系是一个过头。因为每次查询对话时,你最终会做两次工作。
我的建议是将转换和用户之间的关系更改为hasMany,并使用包含ConversationParticipants
,conversion_id
的关联类user_id
以及另一个名为type
的关联属性来引用它们class Conversation extends Doctrine_Record {
public function setTableDefinition() {
// Your Table Fields
}
public function setUp() {
// Your Setup Code
$this->hasMany('User as Users', array(
'local' => 'conversation_id',
'foreign' => 'user_id',
'refClass' => 'ConversationParticipants'
)
);
}
}
class User extends BaseUser
{
public function setTableDefinition() {
// Your User Fields
}
public function setUp()
{
// Your Setup Code
$this->hasMany('Conversation as Conversations', array(
'local' => 'user_id',
'foreign' => 'conversation_id',
'refClass' => 'ConversationParticipants'
)
);
}
}
class ConversationParticipants extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('user_id', 'integer', null, array(
'primary' => true
)
);
$this->hasColumn('conversation_id', 'integer', null, array(
'primary' => true
)
);
$this->hasColumn('type', 'string', 255);
}
}
表示用户的类型(发起者/响应者)。
所以你最终会得到类似于的东西(代码未经过测试!)
{{1}}
这就是我在任何ORM上实现它的方式,我不确定你是否可以在Doctrine中使用关联属性,或者这种成型方式是否会起作用,因为我不是专家在Doctrine
我希望这很有用,,,