我有一个实体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 myEntity;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
/** @ORMMappedSuperclass */
class BaseValue
{
/**
* @var int
*
* @ORMId
* @ORMColumn(name="id", type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMOneToOne(targetEntity="Field", inversedBy="value")
* @ORMJoinColumn(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 myEntity;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
/**
* Value
* @package myEntity
*
* @ORMEntity
* @ORMTable(name="integers")
*/
class Integer extends BaseValue
{
/**
* @var integer
*
* @ORMColumn(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 myEntity;
use DoctrineORMMapping as ORM;
/**
* Field
* @package myEntity
*
* @ORMEntity
* @ORMTable(name="fields")
*/
class Field
{
/**
* @var int
*
* @ORMId
* @ORMColumn(name="id", type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var
* @ORMManyToOne(targetEntity="Item", inversedBy="fields")
* @ORMJoinColumn(name="iid", referencedColumnName="id")
*/
protected $item;
/**
* @var
* @ORMManyToOne(targetEntity="Label", inversedBy="fields")
* @ORMJoinColumn(name="lid", referencedColumnName="id")
*/
protected $label;
/**
* @ORMOneToOne(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) && 'myEntityLabel' == 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 myEntityItem $item */
/* @var myEntityCollection $collection */
$item = $this->getEntityManager()->getRepository('myEntityItem')->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());
}
在这里它崩溃了:
DoctrineDBALExceptionTableNotFoundException
Datei:
/var/www/html/myproject/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php: 53Meldung:
执行"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
的文档,因为遵循文档来防止问题是非常重要的。
在开发期间对您的理论模型模式进行一些验证,以确保所有映射都是正确的,这也是可取的。