与Doctrine PHP的关联

时间:2010-10-11 11:22:55

标签: php database doctrine associations

我正在尝试使用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”。

我想我需要一个联结表来完成我想做的事情?在这种情况下你会做什么?

感谢您的回答,

马丁

2 个答案:

答案 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)

我认为最好将ConversationUser表之间的关系重新建模为多种方式。因为即使一个对话只有2个用户,它们仍被认为不止一个。

在之前的解决方案中,拥有两个与同一个表(对话)的多个关系是一个过头。因为每次查询对话时,你最终会做两次工作。

我的建议是将转换和用户之间的关系更改为hasMany,并使用包含ConversationParticipantsconversion_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

我希望这很有用,,,