Doctrine :: не может читать от дочерних объектов

У меня есть сущность, BaseValue, как сопоставленный суперкласс.
Вторая сущность, называемая Field, сопоставляет этот суперкласс.

Я могу хранить его и значения дочерних классов из BaseValue хранятся в правильной таблице.

Но если я пытаюсь прочитать их, я получаю эту ошибку:

Возникла исключительная ситуация при выполнении ‘SELECT t0.id AS id_1, t0.iid AS iid_2, t0.lid AS lid_3, t5.fid AS fid_4 ИЗ полей t0 ВЛЕВО СОЕДИНЯТЬ BaseValue t5 ON t5.fid = t0.id WHERE t0.iid = ? с параметрами [1]:

SQLSTATE [42S02]: Базовая таблица или представление не найдено: 1146 Таблица «testproject.BaseValue» не существует

Конечно, его не существует, потому что у него нет ценностей. Все они хранятся в таблицах дочерних объектов.

Производная сущность (сопоставленный суперкласс):

<?php

namespace my\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/** @ORM\MappedSuperclass */
class BaseValue
{
/**
* @var int
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\OneToOne(targetEntity="Field", inversedBy="value")
* @ORM\JoinColumn(name="fid", referencedColumnName="id")
**/
private $field;

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

/**
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}

public function setField($field){
$this->field=$field;
}

public function getField(){
return $this->field;
}
}

Один из детей:

<?php

namespace my\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
* Value
* @package my\Entity
*
* @ORM\Entity
* @ORM\Table(name="integers")
*/
class Integer extends BaseValue
{
/**
* @var integer
*
* @ORM\Column(name="value", type="integer", nullable=true)
*/
protected $value;

/**
* @return string
*/
public function getValue()
{
return $this->value;
}

/**
* @param string $value
*/
public function setValue($value)
{
$this->value = $value;
}
}

Сущность, которая имеет отношение к одному из детей:

<?php
namespace my\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Field
* @package my\Entity
*
* @ORM\Entity
* @ORM\Table(name="fields")
*/
class Field
{
/**
* @var int
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;


/**
* @var
* @ORM\ManyToOne(targetEntity="Item", inversedBy="fields")
* @ORM\JoinColumn(name="iid", referencedColumnName="id")
*/
protected $item;

/**
* @var
* @ORM\ManyToOne(targetEntity="Label", inversedBy="fields")
* @ORM\JoinColumn(name="lid", referencedColumnName="id")
*/
protected $label;

/**
* @ORM\OneToOne(targetEntity="BaseValue", mappedBy="field", cascade="persist")
**/
private $value;

protected $temp;

public function __construct($label=null, $value=null){
$this->setLabel($label);
$this->setValue($value);
}

public function setItem(Item $item = null){
$this->item = $item;
}

public function getItem(){
return $this->item;
}

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

/**
* @return string
*/
public function getValue()
{
return $this->value->getValue();
}

/**
* @param string $value
*/
public function setValue($value)
{
$sType = gettype($value);
switch($sType){
case 'boolean':
$this->setBooleanValue($value);
break;
case 'integer':
$this->setIntegerValue($value);
break;
case 'double':
$this->setDoubleValue($value);
break;
case 'string':
$this->setStringValue($value);
break;
case 'array':
$this->setArrayValue($value);
break;
case 'object':
$this->setObjectValue($value);
break;
case 'resource':
$this->setResourceValue($value);
break;
case 'NULL':
$this->setNullValue();
break;
default:
break;
}
}

protected function setBooleanValue($value){
$this->value = new Boolean($value);
$this->value->setValue($value);
$this->value->setField($this);
}

protected function setIntegerValue($value){
$this->value = new Integer($value);
$this->value->setValue($value);
$this->value->setField($this);
}

protected function setDoubleValue($value){
$this->value = new Double($value);
$this->value->setValue($value);
$this->value->setField($this);
}

protected function setStringValue($value){
$this->value = new String($value);
$this->value->setValue($value);
$this->value->setField($this);
}

protected function setArrayValue($value){
throw new \Exception ('arrays are currently not working');
}

protected function setObjectValue($value){
throw new \Exception ('objects are currently not working');
}

protected function setResourceValue($value){
throw new \Exception ('resources are currently not working');
}

protected function setNullValue(){
}

public function setLabel($label){
if( is_object($label) && 'my\Entity\Label' == get_class($label)){
$this->label = $label;
$this->temp=null;
}else{
$this->temp = $label;
}
}

public function getLabel(){
if( $this->label !== null){
return $this->label;
} else {
return $this->temp;
}
}
}

Контроллер, читать:

public function testRead()
{
/* @var \my\Entity\Item $item  */
/* @var \my\Entity\Collection $collection  */
$item = $this->getEntityManager()->getRepository('my\Entity\Item')->findOneBy(array('id'=>'1'));
$this->sDesktop .= 'Item ID = ' . $item->getId();
$collection = $item->getCollection();
$this->sDesktop .= '<br>Collection = ' . $collection->getName();
$this->sDesktop .= '<br>Directive = ' . $collection->getDirective();
count($item->getFields());
}

И вот он падает с:

Doctrine\DBAL\Exception\TableNotFoundException

Datei:
/var/www/html/myproject/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:53

Meldung:
Возникла исключительная ситуация при выполнении ‘SELECT t0.id AS id_1, t0.iid AS iid_2, t0.lid AS lid_3, t5.fid AS fid_4 FROM pimfields t0 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ BaseValue t5 ON t5.fid = t0.id WHERE t0.iid = ? с параметрами [1]:

SQLSTATE [42S02]: Базовая таблица или представление не найдено: 1146 Таблица «myproject2.BaseValue» не существует

1

Решение

В документации Вы можете прочитать это:

Сопоставленный суперкласс не может быть сущностью, он не может запрашивать и постоянные отношения, определенные сопоставленным суперклассом, должны быть однонаправленными (только со стороны владельца)

У вас обратная сторона $value определены в Field сущность, указывающая на отображенный суперкласс BaseValue, Это недопустимо и, скорее всего, вызывает проблемы.

Предлагаю прочитать всю документацию по использованию учения @MappedSuperClass правильно, прежде чем продолжить, так как очень важно следовать документации, чтобы избежать проблем.

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]