原则通过字段值覆盖关系

时间:2016-11-09 22:35:44

标签: php doctrine-orm

看一下以下模型:

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']);无效。

编辑我注意到如果删除@id注释,我会得到预期的结构。

1 个答案:

答案 0 :(得分:0)

那么经理的身份也应该是团队的主要关键?那么你的主键是同时的外键吗?不建议这样做。

我建议一个团队的主键是独立的,并且在第二个属性中与经理有关系。

如果您需要结果中的经理ID,则可以达到在您的自定义存储库中,或者您的Team类中的其他属性及其getter未映射到ORM。