[英]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'));
我認為將Conversation
和User
表之間的關系重新建模為多種方式會更好。 因為即使一個對話只有2個用戶,它們仍被認為不止一個。
在前面的解決方案中,擁有兩個與同一個表(對話)的多個關系是一個過頭。 因為每次查詢對話時,你最終會做兩次工作。
我的建議是將轉換和用戶之間的關系更改為hasMany,並使用包含conversion_id
, user_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.