Как расширить сущность с внутренним отношением? - PullRequest
1 голос
/ 23 апреля 2019

Я надеюсь, что вы сможете помочь, потому что я искал несколько дней. У меня есть класс под названием «Атрибуты». В нем есть parentId, который ссылается на другую запись 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.

Пробовал разные виды геттеров и сеттеров и оставлял их вне родительского.

Искал в Интернете ответ, но не видел наследства с внутренними отношениями.

Атрибуты класса:

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 в расширенном классе.

1 Ответ

2 голосов
/ 23 апреля 2019

Ваши родительские сеттеры выглядят так:

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

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

   return $this;
}

Это можно исправить, просто заменив :Products на :Attributes в конце строки setParent в классе продукта.

Но вы должны использовать интерфейс

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
{
   /*****/
}
...