Ассоциации с доктриной PHP - PullRequest
3 голосов
/ 11 октября 2010

Я пытаюсь связать два объекта с Doctrine (PHP).

У меня есть два объекта: пользователь и беседа

У одного пользователя много разговоров, и разговор принадлежит максимум двум пользователям (по инициатору разговора и одному получателю).

Итак, в моем классе Доктрины у меня есть это в классе Разговора:

$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".

Полагаю, мне нужна соединительная таблица, чтобы выполнить то, что я хочу сделать? Что бы вы сделали в этом случае?

Спасибо за ваши ответы,

Martin

Ответы [ 2 ]

1 голос
/ 11 октября 2010

мое предположение будет следующим:

$this->hasMany('Conversation as Initiations', array('local'=> 'id', 'foreign'=> 'initiator_id'));
$this->hasMany('Conversation as Responses', array('local'=> 'id', 'foreign'=> 'responder_id'));
0 голосов
/ 11 октября 2010

Я думаю, что было бы лучше смоделировать отношение между таблицами 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 или еслиэтот способ лепки сработает, так как я не эксперт в доктрине

Надеюсь, это было полезно ,,,

...