【问题标题】:DiscriminatorColumn in Symfony Doctrine duplicated or not existsSymfony Doctrine 中的 DiscriminatorColumn 重复或不存在
【发布时间】: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


【解决方案1】:

实体子域未在 DiscriminatorMap 中映射。例如,您需要这样做:

 * @ORM\DiscriminatorMap({"1" = "Miejsce\DomainBundle\Entity\MiejsceSubdomain", "2" = "Miejsce\DomainBundle\Entity\Subdomain"})

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 2015-04-14
    • 2019-04-15
    • 2018-08-13
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多