【发布时间】:2014-02-24 05:16:12
【问题描述】:
我有这种情况
实体
/**
* Subdomain
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="ridType", type="integer")
* @ORM\DiscriminatorMap({"1" = "Miejsce\DomainBundle\Entity\MiejsceSubdomain"})
*
* @ORM\Table(name="mSubdomains", indexes={
@ORM\Index(name="name", columns={"name"})
,@ORM\Index(name="ridridType", columns={"rid","ridType"})
}))
*/
class Subdomain
/**
* @ORM\Column(type="integer")
* @var integer
*/
private $ridType;
/**
* @ORM\Column(type="integer")
* @var integer
*/
private $rid;
实体 MIEJSCE
/**
* @ORM\OneToOne(targetEntity="Miejsce\DomainBundle\Entity\MiejsceSubdomain", mappedBy="miejsce", cascade={"all"})
* @var Subdomain
*/
protected $subdomain;
ENTITY MiejsceSubdomain
class MiejsceSubdomain extends Subdomain
{
/**
* @ORM\OneToOne(targetEntity="Miejsce\ObiektyBundle\Entity\Miejsce")
* @ORM\JoinColumn(name="rid", referencedColumnName="id")
*/
protected $miejsce;
}
give : 在字段或鉴别器列映射中实体“Miejsce\DomainBundle\Entity\Subdomain”上列“ridType”的重复定义。
当我删除时
/** * @ORM\Column(type="整数") * @var 整数 */ 私人 $ridType;
当我尝试获取时出现错误
$dbrow = $this->repository->createQueryBuilder('s')
->select(['s.rid','s.ridType'])
->where('s.name=:name')
->setParameter('name',$subdomain)
->getQuery()
->getOneOrNullResult();
[Semantical Error] line 0, col 16 near 'ridType FROM': Error: Class Miejsce\DomainBundle\Entity\Subdomain has no field or association named ridType
更新 1 当我尝试从基本实体执行此操作时:
$subdomain = $this->miejsce->getSubdomain();
if(!$subdomain){
$subdomain = new Subdomain();
$subdomain->setRid($this->miejsce->getId());
}
$subdomain->setName($data['hotels_subdomain']);
$this->em->persist($subdomain);
使用参数 ["naslonecznej-lazy", "6662", null] 执行“INSERT INTO mSubdomains (name, rid, ridType) VALUES (?, ?, ?)' 时发生异常:
SQLSTATE[23000]:违反完整性约束:1048 列 'ridType' 不能为空
更新2
$subdomain = $this->miejsce->getSubdomain();
if(!$subdomain){
$subdomain = new MiejsceSubdomain();
$subdomain->setRid($this->miejsce->getId());
}
$subdomain->setName($data['hotels_subdomain']);
$this->em->persist($subdomain);
给
使用参数 ["naslonecznej-lazy", null, 1] 执行“INSERT INTO mSubdomains (name, rid, ridType) VALUES (?, ?, ?)' 时发生异常:
SQLSTATE[23000]:违反完整性约束:1048 列 'rid' 不能为空
为什么 rid 是 null ? var_dump $subdomain 给
object(Miejsce\DomainBundle\Entity\MiejsceSubdomain)[696]
protected 'miejsce' => null
private 'id' (Miejsce\DomainBundle\Entity\Subdomain) => null
private 'name' (Miejsce\DomainBundle\Entity\Subdomain) => string 'aaa' (length=3)
private 'rid' (Miejsce\DomainBundle\Entity\Subdomain) => string '6662' (length=4)
更新3 我试试
$subdomain = $this->miejsce->getSubdomain();
if(!$subdomain){
$subdomain = new MiejsceSubdomain();
$subdomain->setRid($this->miejsce->getId());
}
$subdomain->setName($data['hotels_subdomain']);
$this->miejsce->setSubdomain($subdomain);
$this->em->persist($this->miejsce);
同样的结果 使用参数 ["naslonecznej-lazy", null, 1] 执行“INSERT INTO mSubdomains (name, rid, ridType) VALUES (?, ?, ?)' 时发生异常:
更新4
class Subdomain
{
/**
* @var integer
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", unique=true)
* @var string
*/
protected $name;
/**
* @ORM\Column(type="integer")
* @var integer
*/
protected $rid;
$subdomain = $this->miejsce->getSubdomain();
if(!$subdomain){
$subdomain = new MiejsceSubdomain();
$subdomain->setRid($this->miejsce->getId());
}
$subdomain->setName($data['hotels_subdomain']);
var_dump($subdomain);
$this->em->persist($subdomain);
仍然错误:
An exception occurred while executing 'INSERT INTO mSubdomains (name, rid, ridType) VALUES (?, ?, ?)' with params ["naslonecznej-lazy", null, 1]:
var_dump:
object(Miejsce\DomainBundle\Entity\MiejsceSubdomain)[696]
protected 'miejsce' => null
protected 'rid' => string '6662' (length=4)
protected 'id' => null
protected 'name' => string 'naslonecznej-lazy' (length=17)
正确的是
如果(!$子域){
$subdomain = new MiejsceSubdomain();
$subdomain->setMiejsce($this->miejsce);
}
【问题讨论】:
-
private $rid;如果您希望子类可以访问此内容,则此内容不能是私有的 -
我更改为受保护但有相同的错误 - 运行 php app/console cache:clear 什么原因导致这不起作用?
标签: php symfony doctrine-orm