Doctrine @ORM \ InheritanceType(“SINGLE_TABLE”)和空的DiscriminatorMap值

时间:2014-01-09 06:46:18

标签: php symfony doctrine-orm

我尝试使用鉴别器设置引用,但是当我尝试获取miejsce的子域时出错 - mysql update work fine

错误是:     执行'SELECT t0.id AS id1,t0.name AS name2,t0.rid AS rid3,t0.rid AS rid4,t0.ridType FROM mSubdomains t0 WHERE t0.rid =?时发生异常AND t0.ridType IN()'with params [“5922”]:

是params正常只有miejsce.id? ridType应该是1

当我将此查询推送到phpmyadmin时,我得到:

SELECT t0.id AS id1, t0.name AS name2, t0.rid AS rid3, t0.rid AS rid4, t0.ridType
FROM mSubdomains t0
WHERE t0.rid =5922
AND t0.ridType
IN ( 1 )
LIMIT 0 , 30

和结果:

id1     name2   rid3    rid4    ridType     
1695    test    5922    5922    1
奇怪的是rid3,rid4?

class Miejsce
{
...
   /**
     * @ORM\OneToMany(targetEntity="Miejsce\DomainBundle\Entity\MiejsceSubdomain", mappedBy="miejsce", cascade={"all"})
     * @var Subdomain
     */
    protected $subdomain;

如果MiejsceSubdomain不是抽象的,我会收到错误:

MappingException:实体'Miejsce \ DomainBundle \ Entity \ MiejsceSubdomain'必须是'Miejsce \ DomainBundle \ Entity \ Subdomain'的鉴别器映射的一部分才能在继承层次中正确映射。或者,您可以将'Miejsce \ DomainBundle \ Entity \ Miej`sceSubdomain'设为抽象类,以避免发生此异常。

/**
 * @ORM\Entity
 */
abstract class MiejsceSubdomain extends Subdomain
{

    /**
     * @ORM\ManyToOne(targetEntity="Miejsce\ObiektyBundle\Entity\Miejsce")
     * @ORM\JoinColumn(name="rid", referencedColumnName="id")
     */
    protected $miejsce;

}



/**
 * Subdomain
 * @ORM\Entity
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="ridType", type="integer")
 * @ORM\DiscriminatorMap({"1" = "Miejsce\ObiektyBundle\Entity\Miejsce"})
 *
 * @ORM\Table(name="mSubdomains", indexes={
    @ORM\Index(name="name", columns={"name"})
    ,@ORM\Index(name="ridridType", columns={"rid","ridType"})
}))
 */
class Subdomain
{


    /**
     * @var integer
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    private $name;

    /**
     * @ORM\Column(type="integer")
     * @var integer
     */
    private $rid;

1 个答案:

答案 0 :(得分:1)

DiscriminatorMap应指向子域实体的子节点。 改变:

  • @ORM \ DiscriminatorMap({“1”=“Miejsce \ ObiektyBundle \ Entity \ Miejsce”})

为:

  • @ORM \ DiscriminatorMap({“1”=“Miejsce \ ObiektyBundle \ Entity \ MiejsceSubdomain”})

abstract课程中删除MiejsceSubdomain。 同时将MiejsceSubdomain重命名为SubdomainMiejsce