2017-06-11 11 views
0

私は、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 
} 

答えて

1

あなたは、単一のテーブルで@ORM\InheritanceType("JOINED")を使用しようとしているように見えます。あなたの3つのエンティティで@ORM\Table(name="profile")を使用します。

その結果、Doctrineはあなたのエンティティと何をするべきか分かりません。

@ORM\InheritanceType("JOINED")@ORM\InheritanceType("SINGLE_TABLE")に置き換えることができます。

+0

ガア、「SINGLE_TABLE」が私が試した最初のことでしたが、うまくいきませんでした。 'JOIN'を使って私がやったやり方のいくつかを緩和するように見えましたが、今回はそれだけでうまくいきます。ありがとう。 – Odyss3us

関連する問題