如何扩展内部关系的实体?

问题描述 投票:1回答:1

我希望你能帮忙,因为我现在已经搜索了几天。我有一个名为“属性”的类。在其中,有一个parentId引用Attributes的另一个条目。

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

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

`"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;
}

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

php doctrine symfony4
1个回答
2
投票

你的父母制定者似乎是这样的:

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

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

   return $this;
}

您只需将:Products替换为产品类中setParent行的末尾的: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
{
   /*****/
}
© www.soinside.com 2019 - 2024. All rights reserved.