2016-11-09 2 views
0

Взгляните на следующую модель:Доктрина переопределение соотношение по значению поля

class Team 

    /** 
    * @id 
    * @ManyToOne(targetEntity="Person") 
    * @JoinColumn(name="id_manager", referencedColumnName="id") 
    */ 
    protected $manager; 

    /** 
    * @id 
    * @ManyToOne(targetEntity="Stadium") 
    * @JoinColumn(name="stadium", referencedColumnName="stadium") 
    */ 
    protected $stadium; 

Когда я запрашиваю для команды с помощью массива hidration я:

$qb->select(['a', 'b', 'c']); 
$qb->from(Team::class, 'a'); 
$qb->leftJoin('a.manager', 'b'); 
$qb->leftJoin('a.stadium', 'c'); 

$teams = $qb->getQuery()->getArrayResult(); 

Для каждой команды структура это :

[ 
    "id_manager": 3, 
    "manager": [ 
     "id": 3, 
     "name": "Billy" 
    ], 
    "stadium": 8 
] 

Посмотрите, как «менеджер» загружается как массив (как и ожидалось), но «стадион». При первом знаке выглядит, если поле отношения имеет то же имя, что и столбец, он сохраняет значение столбца. Есть ли способ избежать этой ситуации без переименования поля $stadium ни столбца?

PS: $qb->select(['a', 'b', 'c as stadium2']); не работал.

EDIT Я заметил, что если я удалю аннотацию @id, я получу ожидаемую структуру.

ответ

0

Значит, идентификатор менеджера должен быть основным ключом для команды? Итак, ваш первичный ключ является внешним ключом одновременно? Не рекомендую это.

Я предлагаю первичный ключ команды, который является независимым и имеет отношение к менеджеру во втором атрибуте.

Если вам нужен идентификатор менеджера в вашем результате, вы можете достичь этого, например. в вашем пользовательском репозитории или дополнительным атрибутом и его получателем в вашем классе Team, который не привязан к ORM.

+0

Я полностью согласен с «Первичный ключ - это внешний ключ в то же время не рекомендуется». Но я работаю в консолидированной базе данных, где основные ключи были назначены таким образом. – manix

+0

Но вы можете решить эту проблему, установив отношения OneToOne между Team и Manager. Честно говоря, я не знаю, как эта настройка работала так, как вы ее описываете. Единственное, что я могу себе представить, это то, что исходная команда не имела первичного ключа вообще. – LBA

+0

Проблема в том, что в некотором роде отношение id нельзя загружать как отношение, а как поле. – manix