首页 > 解决方案 > 如何扩展具有内部关系的实体?

问题描述

我希望你能提供帮助,因为我已经找了几天了。我有一个名为“属性”的类。在其中,有一个parentIdwhich 引用了 的另一个条目Attributes

我想用一些额外的字段将实体“属性”扩展为“产品”。除关系外,所有字段都在扩展parentId

Products当我使用 getter 和 setter添加父级时,出现错误:

`"Compile Error: Declaration of Products::setParent(?Attributes $parent): Products must be compatible with Attributes::setParent(?Attributes $parent)
  : Attributes"`

我已经尝试了一个Products包含所有字段的独立实体,但与Attributes导致数据库关系问题的关系。它是Attributes.

尝试了不同类型的 getter 和 setter,并将其从父级扩展。

一直在网上搜索答案,但没有看到具有内部关系的继承。

属性类:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class Attributes
{
    /**
     * @ORM\Id()
     * @ORM\Column(type="string", length=255)
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $val;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $category;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Attributes")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     */
    private $parent;
}

产品类别:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class Products extends Attributes
{
   /**
     * @ORM\Column(type="string", length=255)
     */
    private $newField1;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $newField2;
}

我想知道为什么内部关系“父母”没有被扩展,我很想知道如何在扩展类中获取 parentId。

标签: phpdoctrinesymfony4

解决方案


你的父母二传手似乎是这样的:

/** Product **/
public function setParent(?Attributes $parent): Products
{
   $this->parent = $parent;

   return $this;
}
/** Attribute **/
public function setParent(?Attributes $parent)
{
   $this->parent = $parent;

   return $this;
}

您可以简单地通过在产品类中的 setParent 行末尾替换:Productsby来修复它。:Attributes

但是你应该使用一个接口

interface AttributeInterface 
{
    public function setParent(?AttributeInterface $parent): AttributeInterface
}

并且您的每个实体都应该实施它:

属性:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class Attributes implements AttributesInterface
{
    /*****/
    public function setParent(?AttributeInterface $parent): AttributeInterface
    {
        $this->parent = $parent;

        return $this;
    }
}

产品:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class Products extends Attributes implements AttributesInterface
{
   /*****/
}

推荐阅读