Извлечение сущностей в обратном направлении с помощью Doctrine ORM ManyToOne Relationship - PullRequest
0 голосов
/ 02 ноября 2018

То, что я пытаюсь сделать, это вернуть сущность в отношении ManyToOne, а также сделать обратное и вернуть сущности в отношении OneToMany с помощью Doctrine ORM.

Например, если у меня есть две сущности Tree и Branch, довольно просто использовать Doctrine mapping для запроса определенного дерева и получения списка его ветвей (где связь - это одно дерево -> много ветвей)

Tree Entity

/**
 * @ORM\OneToMany(targetEntity="Branches", mappedBy="tree_id")
 */
protected $branches;

Филиал

/**
 * @ORM\ManyToOne(targetEntity="Branches", inversedBy="tree")
 * @ORM\JoinColumn(name="tree", referencedColumnName="id")
 */
protected $tree;

В этом примере, когда я запрашиваю TreeController, я возвращаю JSON в формате:

{
    "id": "1",
    "name": "TreeOne"
    "branches": [
        {
            "id": "1",
            "name": "BranchOne"
        },
        {
            "id": "1",
            "name": "BranchTwo"
        },
        ...
    ]
}

Вопрос в том, как сделать обратное и получить Branch, а также связанное с ним дерево, сделав вызов BranchController, чтобы результат вызова API был:

{
    "id": "1",
    "name": "BranchOne"
    "tree": {
            "id": "1",
            "name": "TreeOne"
        }
}

Возможно ли это?

1 Ответ

0 голосов
/ 07 ноября 2018

Оказывается, это было проще, чем я думал. Из-за сопоставления обратное так же просто, как и вызов сеттера / получателя, которые сопоставляются с аннотацией Join. Так, например:

public function setTree(?\Tree $tree = null): self
{
    $this->tree = $tree;

    return $this;
}

public function getTree(): ?Tree
{
    return $this->tree;
}

Затем в функции, где вы возвращаете данные в клиентское приложение внешнего интерфейса, вам просто нужно вызвать приведенный выше метод получения:

return array_filter([
    'id' => this->getId(),
    'name' => $this->getName(),
    'tree' => $this->getTree()
]);

И вы получите данные в формате, указанном в вопросе!

...