1

BaseValueマッピングされたスーパークラスとしてエンティティ があります。という 2 番目のエンティティが、Fieldこのスーパークラスをマッピングしています。

私はそれを保存することができ、子クラスの値はBaseValue正しいテーブルに保存されます。

しかし、それらを読み取ろうとすると、次のエラーが発生しました。

'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 = の実行中に例外が発生しました?' パラメータ付き [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;
    }
}

チャイルドの 1 つ:

<?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;
    }
}

子の 1 つと関係があるエンティティ:

<?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

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

説明:
'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 = ?' パラメータ付き [1]:

SQLSTATE [42S02]: ベース テーブルまたはビューが見つかりません: 1146 テーブル 'myproject2.BaseValue' が存在しません

4

1 に答える 1

0

ドキュメントでは、次のことを読むことができます。

マップされたスーパークラスをエンティティにすることはできず、クエリ可能ではなく、マップされたスーパークラスによって定義された永続的な関係は一方向でなければなりません (所有側のみ)。

マッピングされたスーパークラスを指すエンティティ$valueで定義された逆側があります。これは許可されておらず、問題を引き起こしている可能性が最も高いです。FieldBaseValue

@MappedSuperClass問題を防ぐためにドキュメントに従うことが非常に重要であるため、続行する前に教義を正しく使用するためのすべてのドキュメントを読むことをお勧めします。

すべてのマッピングが正しいことを確認するために、開発中にドクトリン モデル スキーマの検証を行うこともお勧めします。

于 2015-08-31T11:59:08.927 に答える