簡體   English   中英

與Doctrine PHP的關聯

[英]Associations with Doctrine PHP

我正在嘗試使用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”的東西。

我想我需要一個聯結表來完成我想做的事情? 在這種情況下你會做什么?

謝謝您的回答,

馬丁

我的猜測是這樣的:

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

我認為將ConversationUser表之間的關系重新建模為多種方式會更好。 因為即使一個對話只有2個用戶,它們仍被認為不止一個。

在前面的解決方案中,擁有兩個與同一個表(對話)的多個關系是一個過頭。 因為每次查詢對話時,你最終會做兩次工作。

我的建議是將轉換和用戶之間的關系更改為hasMany,並使用包含conversion_iduser_id和名為type的附加關聯屬性的關聯類ConversationParticipants來引用它們,以指示用戶的類型(Initiator / Responder)。

所以你最終會得到類似的東西(代碼沒有經過測試!)

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);

    }
}

這就是我將如何在任何ORM上實現它,我不確定你是否可以在Doctrine中使用關聯屬性,或者這種成型方式是否會起作用,因為我不是Doctrine的專家

我希望這可以幫到你 ,,,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM