@tukreb

Как отключить наследование в Doctrine?

Как можно отключить в doctrine наследование? То есть чтобы doctrina не проверяла mapping и работала с этими классами как с обычными классами без extends.

Самое наследование в данной ситуации мне нужно только, чтобы отнаследовать некоторые методы, которые я не хочу, чтобы можно было бы вызывать напрямую из родителя.

UPD:
Я пробовал использовать подход InheritanceType("JOINED"), но он мне выбрасывает ошибку
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
которую я не могу отследить.

Вот пример упрощённых классов.
/**
 * Parent
 * @ORM\Table(blablabla)
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({
 *     "parent" = "App\Model\Parent\Parent",
 *     "children" = "App\Model\Children\Children"
 * })
 */
class Parent
{
	/**
     * @var Id
     *
     * @ORM\Column(name="id_parent", type="parent_id", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    protected $id;
	
	//другие поля.
	
	protected function __construct(Id $id, ........)
	{
		///...... init
	}
}


/**
 * Children
 *
 * @ORM\Table(blablabla)
 * @ORM\Entity
 */
class Children extends Parent
{
	/**
     * @var Parent
     *
     * @ORM\OneToOne(targetEntity="App\Model\Parent\Parent", cascade={"persist", "remove"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_parent", referencedColumnName="id_parent", onDelete="CASCADE")
     * })
     */
    private $item;
	
	/**
     * @var SomeClassForChilder|null
     *
     * @ORM\OneToOne(targetEntity="App\Model\SomeClassForChilder\SomeClassForChilder",
     *     mappedBy="children", cascade={"persist"})
     */
    private $someClassForChilder;
	
	//другие поля.
	
	public function __construct(Id $id, ........)
	{
		parent::__construct(Id $id, ....);
		$this->someClassForChilder = new SomeClassForChilder($this)
		///...... init
	}
}


/**
 * SomeClassForChilder
 *
 * @ORM\Table(blablabla)
 * @ORM\Entity
 */
class SomeClassForChilder
{
	/**
     * @var Children
     *
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     * @ORM\OneToOne(targetEntity="App\Model\Children\Children",
     *     inversedBy="someClassForChilder", cascade={"persist", "remove"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_parent", referencedColumnName="id_parent", onDelete="CASCADE")
     * })
     */
    private $children;
	
	public function __construct(Children $children)
	{
		///...... init
	}
	
}


Далее, сохраняем в базу данных

$children = new Children($id, ....);
persist(children )
flash...


И получаем ошибку
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

Без наследования ни каких проблем нет.
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
@tukreb Автор вопроса
В классе Parent
protected $id;
переименовал в
protected $id_parent;

Забавная ошибка. И как я её должен был диагностировать без метода тыка непонятно, ну да ладно..
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы