Я думаю, что было бы лучше смоделировать отношение между таблицами 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);
}
}
Это то, как я бы реализовал его на любом ORM, хотя я не уверен, что вы можете использовать атрибуты ассоциации в Doctrine или еслиэтот способ лепки сработает, так как я не эксперт в доктрине
Надеюсь, это было полезно ,,,