1

DB に複合キーを持つテーブルがいくつかあります。下の図を参照してください。

複合キーを持つテーブル

この例でわかるようにinterest、 とklistsは独自のものですが、キーとしてidも持っています。kuserDoctrine のドキュメントによると、複合キーのほぼすべてのユースケースをサポートしていますが、複合キーを持つすべてのエンティティは「ASSIGNED」以外の ID ジェネレーターを使用できません。つまり、EntityManager#persist($entity) を呼び出す前に、ID フィールドの値を設定する必要があります。これらのテーブルに関連するエンティティを定義しようとすると、Doctrine がこれを許可していないため、エラーが発生しました。

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

  /**
   * @ORM\Id      
   * @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="users" )      
   * @ORM\JoinColumn(name="kuser", referencedColumnName="id")   
   */
   protected $kuser; 

ライフサイクルコールバックを使用していくつかのコードを実行できることは知っていますが、方法や場所がわからないので、ここで助けが必要です。誰か教えてくれたり、正しいパスを教えてくれますか?

4

1 に答える 1

2

基本に立ち返って。ここから始めることをお勧めします: http://docs.doctrine-project.org/en/latest/reference/association-mapping.html

class KUser
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

class Interest
{
      /**
       * @ORM\Id
       * @ORM\Column(name="id", type="integer", nullable=false)
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;

      /**      
       * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")      
       * @ORM\JoinColumn(name="kuser_id", referencedColumnName="id")   
       */
      protected $kuser; 

Interest と KUser の間に一方向のManyToOne関係を確立するために必要なのはそれだけです。双方向が必要な場合は、$interestsKUser にプロパティを追加しinversedBy、Interest.kuser に設定します。

続行する前に、単純な関係を理解し​​ていることを確認してください。

リンクテーブルに追加のプロパティがない場合、 Doctrine はManyToManyリンクテーブルを自動生成します。KUserHasKLists には追加の属性があります。ManyToOneしたがって、それをエンティティにしてから、リレーションを使用して他のテーブルをリンクする必要があります。技術的には、おそらくここでも複合キーを使用できますが、自動インクリメントの主キーを定義する方がはるかに簡単です。

class KUserHasKLists
{
      /**
       * @ORM\Id
       * @ORM\Column(name="id", type="integer", nullable=false)
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;

      /**      
       * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")      
       * @ORM\JoinColumn(name="kuser_id", referencedColumnName="id")   
       */
      protected $kuser; 

      /**      
       * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KList")      
       * @ORM\JoinColumn(name="klist_id", referencedColumnName="id")   
       */
      protected $klist; 

繰り返しになりますが、単純なリレーションから始めて、何が起こっているのかを確実に理解してください。phpunit に慣れている場合は、機能テストを行ってください。そうでない場合は、自分で Symfony コマンドを作成して、コマンド ラインからこの機能を試すことができるようにします。

于 2013-08-27T15:59:11.537 に答える