Взгляните на следующую модель:Доктрина переопределение соотношение по значению поля
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
, я получу ожидаемую структуру.
Я полностью согласен с «Первичный ключ - это внешний ключ в то же время не рекомендуется». Но я работаю в консолидированной базе данных, где основные ключи были назначены таким образом. – manix
Но вы можете решить эту проблему, установив отношения OneToOne между Team и Manager. Честно говоря, я не знаю, как эта настройка работала так, как вы ее описываете. Единственное, что я могу себе представить, это то, что исходная команда не имела первичного ключа вообще. – LBA
Проблема в том, что в некотором роде отношение id нельзя загружать как отношение, а как поле. – manix