Doctrine 2 从相关实体获取项目
Posted
技术标签:
【中文标题】Doctrine 2 从相关实体获取项目【英文标题】:Doctrine 2 get items from related entities 【发布时间】:2016-09-01 06:58:34 【问题描述】:我有一个具有多对一、一对一关系的实体。我有另一个实体,它链接到第一个实体,我想做的是获取有关第一个实体以及与之相关的所有其他实体的信息。
由于某种原因,当我拨打电话时,它在相关实体中返回 NULL。
代码:
<?php
namespace App\Model\Entities;
use Doctrine\ORM\Mapping as ORM,
Doctrine\Common\Collections\ArrayCollection;
use Kdyby\Doctrine\Entities\BaseEntity;
/**
* Doctrine entity for resorts in destinations
* @package App\Model\Entities
* @ORM\Entity
*/
class Resort extends BaseEntity
/**
* autoincremented resort id
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* resort name
* @ORM\Column(type="string")
*/
protected $title;
/**
* @ORM\OneToOne(targetEntity="ResortProperties", mappedBy="resort", cascade="persist")
*/
private $properties;
public function __construct()
$this->properties = new ArrayCollection();
/**
* HERE I WANT TO GET DATA FROM ANOTHER ENTITY
* @return type
*/
public function getProperties()
return $this->properties;
而相关的实体是这样的:
<?php
namespace App\Model\Entities;
use Doctrine\ORM\Mapping as ORM,
Doctrine\Common\Collections\ArrayCollection;
use Kdyby\Doctrine\Entities\BaseEntity;
/**
* Doctrine entity for resort properties
* @package App\Model\Entities
* @ORM\Entity
*/
class ResortProperties extends BaseEntity
/**
* autoincremented id
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* resort id
* @ORM\OneToOne(targetEntity="Resort", inversedBy="Resort", cascade="persist", "remove")
* @ORM\JoinColumn(onDelete="CASCADE")
*/
protected $resort;
/**
* parameter1
* @ORM\Column(type="string")
*/
protected $parameter1;
我预计,当我调用 $repository->findAll();
时,我会得到所有的 Resort 实体,并且在 Resort->properties
中会加入 ResortProperty 实体,但它是 NULL。
我不知道我做错了什么,有人可以指出我的错误吗?谢谢
【问题讨论】:
【参考方案1】:我认为问题出在 JoinColumn-Annotation 上。 具有外键(ResortProperties)的实体需要知道如何连接两个表。 Resort-Entity 上的“inversedBy”-Statement 然后使用此规则。
在您的 ResortProperties-Entity 中应该如下所示:
/**
* resort id
* @ORM\OneToOne(targetEntity="Resort", inversedBy="Resort", cascade="persist", "remove")
* @ORM\JoinColumn(name="resort_id", referencedColumnName="id")
*/
protected $resort;
“resort_id”是您的外键列的名称。
希望这会有所帮助。
【讨论】:
谢谢,我必须做一些其他的更改,我会在一分钟内发布它【参考方案2】:在ResortProperties
实体中,我必须进行此更改:
class ResortProperties extends BaseEntity
/**
* resort id
* @ORM\OneToOne(targetEntity="Resort", inversedBy="properties", cascade="persist", "remove")
* @ORM\JoinColumn(name="resort_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $resort;
在Resort
实体中,我必须像这样更改它:
class Resort extends BaseEntity
/**
* @ORM\OneToOne(targetEntity="ResortProperties", mappedBy="resort", cascade="persist")
*/
private $properties;
public function __construct()
parent::__construct();
$this->properties = new ArrayCollection();
现在它工作正常,希望这对其他人有帮助
【讨论】:
以上是关于Doctrine 2 从相关实体获取项目的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Symfony 2.1 从内部控制器获取 Doctrine 实体的实体管理器
有没有办法从 Doctrine 2.2 实体中获取 FK 列值?