2016-08-03 15 views
2

Ich habe gerade Entities in meiner Anwendung:Symfony2 - ManyToMany mit doppelten Zeilen

  • Seite
  • blockieren

A Page viele Blöcke haben, die sich über viele Seiten geteilt werden, so Es ist ziemlich offensichtlich, dass die Beziehung eine ManyToMany ist. Ich muss jedoch in der Lage sein, denselben Block zweimal (oder mehr) derselben Seite hinzuzufügen. Doctrine erstellt die Join-Tabelle "page_block" automatisch, aber mit page_id und block_id als Primärschlüssel. Daher wird beim Hinzufügen eines Duplikats ein Fehler ausgegeben.

Ist es möglich, ohne Hinzufügen einer zusätzlichen Entität der Doktrin zu sagen, dass Duplikate auf der Page - Block - Relation zulässig sind?

+1

Duplizieren? : http: //stackoverflow.com/questions/24120435/doctrine-manytomany-on-same-entity-duplicate-entry-error –

+0

@BenHillier kein Duplikat, auch wenn es ganz dasselbe ist. Das Problem ist, dass ich so viele Duplikate zulassen möchte, wie ich möchte, so dass derselbe Block X-mal zu derselben Seite hinzugefügt werden kann. – Lucio

Antwort

1

Nun, ich bin nicht sicher über dieses Verhalten in der Lehre, aber wenn das der Fall ist, dann können Sie etwas tun, was ich fast immer tue. Stellen Sie die ManyToMany-Beziehung als zwei OneToMany-ManyToOne dar. Sie müssen Ihre eigene PageBlock-Entität erstellen und ihre Fremdschlüssel konfigurieren.

class Page{ 
    /** 
    * @var array 
    * 
    * @ORM\OneToMany(targetEntity="PageBlock", mappedBy="page", cascade={"all"}) 
    */ 
    private $pageBlocks; 
} 

class Block{ 
     /** 
     * @var array 
     * 
     * @ORM\OneToMany(targetEntity="PageBlock", mappedBy="block", cascade={"all"}) 
     */ 
     private $pageBlocks; 
    } 

class PageBlock{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var \stdClass 
    * 
    * @ORM\ManyToOne(targetEntity="Page", inversedBy="pageBlocks") 
    * @ORM\JoinColumn(name="id_page", referencedColumnName="id") 
    */ 
    private $page; 

    /** 
    * @var \stdClass 
    * 
    * @ORM\ManyToOne(targetEntity="Block", inversedBy="pageBlocks") 
    * @ORM\JoinColumn(name="id_block", referencedColumnName="id") 
    */ 
    private $block; 
    } 

Wie Sie sehen können, bleibt der Primärschlüssel als ID, also Problem gelöst. Ich sage fast immer, weil ich es so mache, wenn ich ein zusätzliches Attribut in der Beziehung brauche (fast immer passiert es). Ich vermute, dass dies eine Möglichkeit wäre, dies mit der Annotation von ManyToMany zu tun, aber es gibt keinen Unterschied zu diesem Ansatz.

Ich hoffe, dies hilft Ihnen.

Verwandte Themen