2012-04-24 2 views
1

Я просто запустил себя в эту сложную ситуацию. У меня есть сущность, называемая Gift.Условная ассоциация в Doctrine2

Теперь субъект датирования должен иметь поле receiver, которое может быть связано с 2 объектами RegisteredUser entity ИЛИ Guest объект.

Проблема здесь в том, как определить ассоциацию для поля получателя !!

Я думал о создании объекта под названием GiftReceiver использовать сопоставление наследования, но я не могу сопоставить дискриминатор с классом, который не распространяется на GiftReceiver.

Я иду не в ту сторону? Есть ли хороший способ реализовать это? Заранее благодарим за помощь! :)

+1

Вы хотите одно свойства для отображения на 2 сущностей? Может быть, вы должны сопоставить его с обычным супер-классом! – Songo

ответ

4

как о создании подкласса User как Guest и вы можете просто отобразить поле приемника к User сущности. Когда вы запрашиваете объект приемника на Gift, доктрина будет получать соответствующий объект Guest или RegisteredUser

0

Как насчет создания чего-то вроде объекта GiftIntermediary. со следующими полями:

Receiver 
RegisteredUser 
Guest 

Затем применяются следующие ассоциации:

Gift.Receiver = GiftIntermediary.Receiver 
RegisteredUser.ID = GiftIntermediary.RegisteredUser 
Guest.ID = GiftIntermediary.Guest 

Вот пример запроса для сбора данных из указанных объединений:

SELECT Gift.*, RegisteredUser.*, Guest.* 
FROM Guest INNER JOIN (RegisteredUser INNER JOIN (Gift INNER JOIN GiftIntermediary ON Gift.Receiver = GiftIntermediary.Receiver) ON RegisteredUser.ID = GiftIntermediary.RegisteredUser) ON Guest.ID = GiftIntermediary.Guest 
1

Может быть, вы могли бы поставить логику в вашу сущность, которая возвращает либо Guest, либо RegisteredUser, оба реализуют тот же интерфейс, что и GiftReceiver.

class Gift { 

    // mapped to guest; nullabe true 
    protected $guest; 

    // mapped to registeredUser; nullabe true 
    protected $registeredUser; 


    public function getReceiver() 
    { 
     return $this->getGuest() ?: $this->getRegisteredUser(); 
    } 

    // getters/setters ... 
} 
Смежные вопросы