【问题标题】:Doctrine error Symfony 3教义错误 Symfony 3
【发布时间】:2016-03-13 11:07:19
【问题描述】:

我有 fos_user 实体,该实体与 oneToOne 和 reservedArea 实体相关。

class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="ReservedAreaBundle\Entity\ReservedArea", cascade={"persist"})
     * @ORM\JoinColumn(name="reserved", referencedColumnName="id", onDelete="SET NULL")
     */
    protected $reserved;

    public function __construct()
    {
        parent::__construct();
    }

    public function getReserved()
    {
        return $this->reserved;
    }

    public function setReserved($reserved)
    {
        $this->reserved = $reserved;
    }
}

在我的 reservedArea 实体中,我只有一个与 File 实体的 OneToMany 关系。

class ReservedArea
{
    /**
    * @ORM\Column(type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="ReservedAreaBundle\Entity\File", mappedBy="reserved_area", cascade={"persist"})
     */
    protected $file;


    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->file = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add file
     *
     * @param \ReservedAreaBundle\Entity\File $file
     *
     * @return ReservedArea
     */
    public function addFile(\ReservedAreaBundle\Entity\File $file)
    {
        $this->file[] = $file;

        return $this;
    }

    /**
     * Remove file
     *
     * @param \ReservedAreaBundle\Entity\File $file
     */
    public function removeFile(\ReservedAreaBundle\Entity\File $file)
    {
        $this->file->removeElement($file);
    }

    /**
     * Get file
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getFile()
    {
        return $this->file;
    }
}

在我的文件实体中,我只有一个简单的字符串。

class File
{
    /**
    * @ORM\Column(type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;

    /**
    * @ORM\Column(type="string")
    */
    protected $file;

    /**
     * @ORM\ManyToOne(targetEntity="ReservedAreaBundle\Entity\ReservedArea", inversedBy="file")
     * @ORM\JoinColumn(name="reserved_area", referencedColumnName="id")
     */
    protected $reservedArea;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set reservedArea
     *
     * @param \ReservedAreaBundle\Entity\ReservedArea $reservedArea
     *
     * @return File
     */
    public function setReservedArea(\ReservedAreaBundle\Entity\ReservedArea $reservedArea = null)
    {
        $this->reservedArea = $reservedArea;

        return $this;
    }

    /**
     * Get reservedArea
     *
     * @return \ReservedAreaBundle\Entity\ReservedArea
     */
    public function getReservedArea()
    {
        return $this->reservedArea;
    }

    /**
     * Set file
     *
     * @param string $file
     *
     * @return File
     */
    public function setFile($file)
    {
        $this->file = $file;

        return $this;
    }

    /**
     * Get file
     *
     * @return string
     */
    public function getFile()
    {
        return $this->file;
    }

现在如果我尝试访问用户文件做类似的事情:

$files = $this->getUser()->getReserved()->getFile();
foreach($files as $file) {
    var_dump($file); //or $file->getFile();
}

我得到一个错误:

注意:未定义索引:reserved_area

在我的数据库中,我添加了一个具有保留区域和两个文件的用户,如果我直接制作:

SELECT u.username, f.file FROM fos_user u INNER JOIN reserved_area r ON u.reserved=r.id INNER JOIN reserved_area_file f ON f.reserved_area=r.id;

我得到了正确的结果。 我哪里出错了?
感谢您的建议。

【问题讨论】:

    标签: php doctrine-orm symfony


    【解决方案1】:

    我找到了问题的解决方案并发布了它,因为可能会对某人有所帮助。
    问题出在这里:

    /**
    * @ORM\OneToMany(targetEntity="ReservedAreaBundle\Entity\File", mappedBy="reserved_area", cascade={"persist"})
    */
    protected $file;
    

    我不能在 mappedBy 中使用 @JoinColumn(name="reserved_are") 中的表名,但我必须使用属性名。
    所以:

    mappedBy="reservedArea"
    

    解决了问题。

    【讨论】:

      【解决方案2】:

      编辑:我回答了原来的问题:https://stackoverflow.com/revisions/35969467/1 然后由作者编辑。


      $reservedAreaFile 类中的注解映射不正确。 mappedByinversedBy 属性必须始终包含来自关联另一端实体的属性名称。 所以在你的情况下File::$reservedArea 应该有inversedBy="file"

      更多示例请参见http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2016-06-02
        • 1970-01-01
        相关资源
        最近更新 更多