我在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
}
答案 0 :(得分:1)
您似乎正在尝试将@ORM\InheritanceType("JOINED")
与单个表一起使用。您在3个实体中使用@ORM\Table(name="profile")
。
结果是Doctrine不知道如何处理您的实体。
您可以尝试将@ORM\InheritanceType("JOINED")
替换为@ORM\InheritanceType("SINGLE_TABLE")
。