2015-08-31 4 views
1

У меня есть объект, BaseValue, как сопоставленный суперкласс. Второй объект, называемый Field, отображает этот суперкласс.Doctrine :: невозможно прочитать из дочерних объектов

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

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

An exception occurred while executing 'SELECT t0.id AS id_1, t0.iid AS iid_2, t0.lid AS lid_3, t5.fid AS fid_4 FROM fields t0 LEFT JOIN BaseValue t5 ON t5.fid = t0.id WHERE t0.iid = ?' with params [1]:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testproject.BaseValue' doesn't exist

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

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

<?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:
An exception occurred while executing 'SELECT t0.id AS id_1, t0.iid AS iid_2, t0.lid AS lid_3, t5.fid AS fid_4 FROM pimfields t0 LEFT JOIN BaseValue t5 ON t5.fid = t0.id WHERE t0.iid = ?' with params [1]:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'myproject2.BaseValue' doesn't exist

+0

Покажите нам код сущностей и контроллеров. –

+0

Из другого вопроса, который задают раньше, ваша проблема в основном принадлежит стороне пользователя и обратной стороне, вы должны знать их задолго до кодирования и тестирования. – Hooli

ответ

0

In the documentation вы можете прочитать, что:

A mapped superclass cannot be an entity, it is not query-able and persistent relationships defined by a mapped superclass must be unidirectional (with an owning side only)

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

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

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

+0

нужно исправить это сегодня .. любой намек, в чем моя проблема? Причина, по которой все хранится ... но не удалось загрузить ее ... – n00n

+0

Как я писал в ответ, проблема заключается в обратной стороне в сущности 'Field'. Это запрещено. – Wilt

+0

@ n00n Вы решили это? – Wilt

Смежные вопросы