与PHP的关联

与PHP的关联,php,database,doctrine,associations,Php,Database,Doctrine,Associations,我正在尝试将两个对象与Doctrine(PHP)关联起来 我有两个对象:用户和会话 一个用户有多个会话,一个会话最多属于两个用户(会话的发起方和一个接收方) 所以,在我的理论课上,我在对话课上有这样一句话: $this->hasOne('User as Initiator', array('local' => 'initiator_id', 'foreign' => 'id')); $this->hasOne('User as Responder', array('loc

我正在尝试将两个对象与Doctrine(PHP)关联起来

我有两个对象:用户和会话

一个用户有多个会话,一个会话最多属于两个用户(会话的发起方和一个接收方)

所以,在我的理论课上,我在对话课上有这样一句话:

$this->hasOne('User as Initiator', array('local' => 'initiator_id', 'foreign' => 'id'));
$this->hasOne('User as Responder', array('local' => 'responder_id', 'foreign' => 'id'));
在用户类中:

$this->hasMany('Conversation as Conversations', array('local'=> 'id', 'foreign'=> ????));
对于这个外键,我想输入一些表示“发起方id或响应方id”的内容

我想我需要一个连接表来完成我想做的事情?在这种情况下你会怎么做

谢谢你的回答


马丁我猜是这样的:

$this->hasMany('Conversation as Initiations', array('local'=> 'id', 'foreign'=> 'initiator_id'));
$this->hasMany('Conversation as Responses', array('local'=> 'id', 'foreign'=> 'responder_id'));

我认为最好将
对话
用户
表之间的关系重新建模为多个表。因为即使一个对话只有两个用户,他们仍然被认为是不止一个

在前面的解决方案中,让两个人在同一张桌子上有许多关系(对话)是一种过头的做法。因为每次查询对话时,您将完成两倍的工作

我的建议是将转换和用户之间的关系更改为hasMany,并使用关联类
ConversationParticients
引用它们,该关联类包含
conversion\u id
user\u id
和一个名为
type
的附加关联属性,以指示用户的类型(发起人/响应者)

因此,您将得到与此类似的结果(代码未经测试!)

这就是我在任何ORM上实现它的方式,但我不确定您是否可以在条令中使用关联属性,或者这种建模方式是否有效,因为我不是条令专家


我希望这是有帮助的,,,,

不,这不起作用,因为我想通过像$user->Conversations这样的操作来访问一个用户的所有对话;而使用您的解决方案,这可能是不可能的。我明白您的问题。嗯,这是一个非常有趣的问题。条令手册没有涵盖这个特殊情况,甚至没有这很不寻常。所以+1对于你的问题非常感谢你的回答,我已经按照你的建议对它进行了建模,它看起来很好。我没有尝试使用关联属性(对话类型),因为我认为该原则不允许这样做,所以我将我的two hasOne用户保留在对话类中。
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);

    }
}