私は、Symfony 3プロジェクトでDoctrine 2を使用してクラステーブルの継承を実装しています。Doctrine 2 - クラステーブルの継承マッピングクラスの継承マッピングストラテジー
マッピングされたスーパークラス(AbstractProfile
)のサブクラス(EmployeeProfile
)を持続しようとすると、私は次のエラーを取得する:
An exception occurred while executing 'INSERT INTO profile (id) VALUES (?)' with params [27, 10, 85, \"employee\"]:\n\nSQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
私が間違って何が起こっているのか全くわからないんだけど、なぜDoctrineがありますAbstractProfile
のプロパティを完全に無視しているクエリが生成されました。当初は、そのプロパティが子どもには見えないと考えていましたが、プロパティをprotectedに設定しても、エラーは残ります。
どのように修正することができますか、またはこの機能を意図した目的に使用しないで四角いペグを円形の穴に合わせようとしていますか?
profile
DB表:
+------------+--------------+------+-----+-------------------+----------------+
| 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スーパークラス:
/**
* 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
}
ガア、「SINGLE_TABLE」が私が試した最初のことでしたが、うまくいきませんでした。 'JOIN'を使って私がやったやり方のいくつかを緩和するように見えましたが、今回はそれだけでうまくいきます。ありがとう。 – Odyss3us