使用Doctrine ORM ManyToOne关系以相反的方向获取实体

时间:2018-11-02 20:57:05

标签: mysql orm annotations doctrine mapping

我要完成的工作是使用Doctrine ORM返回一个ManyToOne关系中的实体,并且执行相反的操作并返回一个OneToMany关系中的实体。

例如,如果我有两个实体TreeBranch,则使用Doctrine映射查询特定的树并获取其分支列表是很简单的(其中关系是一棵树- >许多分支机构

树实体

/**
 * @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"
        },
        ...
    ]
}

问题是,如何通过调用BranchController来反向进行操作并获得一个Branch及其关联的Tree,这样对API的调用结果将是:

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

这可能吗?

1 个答案:

答案 0 :(得分:0)

原来,这比我想象的要容易。由于存在映射,因此反向操作就像调用针对Join注释映射的setter / getter一样简单。例如:

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

    return $this;
}

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

然后在将数据返回到前端客户端应用程序的函数中,您只需调用上面的getter:

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

您将获得问题中要求的格式的数据!