我有一个实体BaseValue
作为映射的超类。
第二个实体,名为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 =?'用params [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:53Meldung:
执行'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 = ?用params [1]:SQLSTATE [42S02]:未找到基表或视图:1146表'myproject2.BaseValue'不存在
答案 0 :(得分:0)
In the documentation 您可以阅读:
映射的超类不能是实体,它不是可查询的,映射的超类定义的持久关系必须是单向的(仅限拥有方)
您在Field
实体中定义了反向边BaseValue
,指向映射超类@MappedSuperClass
。这是不允许的,最有可能导致问题。
我建议您在继续之前阅读有关正确使用原则{{1}}的所有文档,因为遵循文档以防止出现问题非常重要。
建议在开发期间执行一些validation of your doctrine model schema以确保所有映射都正确。