0

我有一个具有多对一、一对一关系的实体。我有另一个实体,它链接到第一个实体,我想做的是获取有关第一个实体以及与之相关的所有其他实体的信息。

出于某种原因,当我拨打电话时,它在相关实体中返回 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。

我不知道我做错了什么,有人可以指出我的错误吗?谢谢

4

2 回答 2

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”是您的外键列的名称。

希望这可以帮助。

于 2016-09-01T12:39:14.943 回答
0

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();
    }
}

现在它工作正常,希望这对其他人有帮助

于 2016-09-01T15:28:01.397 回答