Doctrine 2 - 错误持久化类表继承映射策略的子类

时间:2017-06-11 16:17:40

标签: php inheritance doctrine-orm doctrine

我在Symfony 3项目中使用Doctrine 2实现了类表继承,以便拥有一个基本配置文件表,其中包含员工和公司配置文件。

当试图保持映射的超类(EmployeeProfile)的子类(AbstractProfile)时,我收到以下错误:

  

执行' INSERT INTO配置文件(id)VALUES时发生异常   &#39(?);使用params [27,10,85,\" employee \"]:\ n \ n SQLSTATE [HY093]:   参数号无效:绑定变量数不匹配   令牌数量

我不完全确定出了什么问题,以及为什么Doctrine会生成一个完全忽略AbstractProfile属性的查询。最初我认为这是由于所述属性对孩子们不可见,但即使在将属性设置为受保护之后,错误仍然存​​在。

我究竟能如何解决这个问题,或者我是否试图通过不使用此功能来将方形钉固定到圆孔中?

profile数据库表:

+------------+--------------+------+-----+-------------------+----------------+
| Field      | Type         | Null | Key | Default           | Extra          |
+------------+--------------+------+-----+-------------------+----------------+
| id         | int(11)      | NO   | PRI | NULL              | auto_increment |
| user_id    | int(11)      | NO   |     | NULL              |                |
| type       | varchar(100) | NO   |     | NULL              |                |
| status     | int(11)      | NO   |     | NULL              |                |
| created_at | datetime     | NO   |     | CURRENT_TIMESTAMP |                |
| updated_at | datetime     | NO   |     | CURRENT_TIMESTAMP |                |
+------------+--------------+------+-----+-------------------+----------------+

AbstractProfile Super Class:

/**
 * AbstractProfile
 *
 * @ORM\Table(name="profile")
 * @ORM\Entity(repositoryClass="ProfileBundle\Repository\ProfileRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *     "employee" = "EmployeeProfile",
 *     "company" = "CompanyProfile"
 * })
 */
abstract class AbstractProfile
{

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

    /**
     * @var int
     *
     * @ORM\Column(name="status", type="integer")
     */
    protected $status;

    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="profile")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    //... Getters, setters and all the rest
}

EmployeeProfile子实体:

<?php

/**
 * EmployeeProfile
 *
 * @ORM\Table(name="profile")
 * @ORM\Entity
 */
class EmployeeProfile extends AbstractProfile
{
    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Skill", inversedBy="profiles")
     * @ORM\JoinTable(name="profile_skills",
     *      joinColumns={@ORM\JoinColumn(name="profile_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="skill_id", referencedColumnName="id", unique=true)}
     *      )
     */
    private $skills;

    public function __construct()
    {
        $this->skills = new ArrayCollection();
    }

    //... Getters, setters and all the rest
}

CompanyProfile子实体:

<?php

/**
 * CompanyProfile
 *
 * @ORM\Table(name="profile")
 * @ORM\Entity
 */
class CompanyProfile extends AbstractProfile
{    
    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Event", inversedBy="profiles")
     * @ORM\JoinTable(name="profile_events",
     *      joinColumns={@ORM\JoinColumn(name="profile_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="event_id", referencedColumnName="id", unique=true)}
     *      )
     */
    private $events;

    public function __construct()
    {
        $this->events = new ArrayCollection();
    }

    //... Getters, setters and all the rest
}

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试将@ORM\InheritanceType("JOINED")与单个表一起使用。您在3个实体中使用@ORM\Table(name="profile")

结果是Doctrine不知道如何处理您的实体。

您可以尝试将@ORM\InheritanceType("JOINED")替换为@ORM\InheritanceType("SINGLE_TABLE")