不能从子实体中读取


Doctrine :: cannot read from child entities

我有一个实体BaseValue,作为映射的超类。第二个实体,称为Field,正在映射这个超类。

我可以存储它,并且BaseValue的子类的值存储在正确的表中。

但是如果我试着读它们,我得到了这个错误:

在执行'SELECT t0 '时发生异常。id AS id_1, t0。iid AS iid_2,到0。lid_3, t5。fid AS fid_4 FROM fields to 0 LEFT JOIN BaseValue t5 ON t5。Fid = 0。id WHERE to 0。Iid = ?'与参数[1]:

SQLSTATE[42S02]: Base table or view not found: 1146BaseValue'不存在

当然不存在,因为它没有值。这些都存储在子实体的表中。

派生实体(映射的超类):

<?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,到0。lid_3, t5。fid AS fid_4 FROM pimfields to 0 LEFT JOIN BaseValue t5 ON t5。Fid = 0。id WHERE to 0。Iid = ?'与参数[1]:

SQLSTATE[42S02]: Base table or view not found: 1146BaseValue'不存在

在文档中你可以读到:

映射的父类不能是实体,不能查询,并且映射的父类定义的持久关系必须是单向的(只有一个拥有方)

Field实体中定义了一个逆侧$value,指向映射的超类BaseValue。这是不允许的,而且很可能引起问题。

我建议在继续之前阅读所有关于正确使用原则@MappedSuperClass的文档,因为遵循文档来防止问题是非常重要的。

在开发期间对您的理论模型模式进行一些验证,以确保所有映射都是正确的,这也是可取的。