2016-03-31 20 views
0

formunu oluşturan üç basit varlığım var.Birçok katılan 3 sınıfla birçok ilişki -

class Product { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="ProductsCategories", mappedBy="category") 
    */ 
    private $categories; 

    //.. 

class ProductsCategories { 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Product") 
    */ 
    private $product; 

    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Category") 
    */ 
    private $category; 

    //.. 


class Category { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="ProductsCategories", mappedBy="product") 
    */ 
    private $products; 

    //.. 

Ek alanlar eklemek için çok fazla ilişkilendirmeyle ek sınıf oluşturmak istiyorum. Benim sorunum form alanını oluşturmak için nasıl bilmiyorum yani, burada form tipi

//.. 
    ->add('categories', 'entity', [ 
     'class' => 'AppBundle:Category', 
     'choice_label' => function($category, $key, $index) { 
      return $category->getName(); 
     }, 
     'multiple' => true, 
     'required' => true, 
     'expanded' => false, 
    ]) 
    //.. 

olduğu Ama formu gönderdiğinde bu hataları gösterir:

Expected value of type "Doctrine\Common\Collections\Collection|array" for association field "AppBundle\Entity\Product#$categories", got "AppBundle\Entity\Category" instead.

teşekkürler.

cevap

0

DÜZENLEME: Üzgünüz, Çok Yönlü bir Öznitelik istediğinizi anlayamadım, "öznitelikleri" ve bir alan EntityType kategorisi için bazı alanlar ile bir ProductCategoryType oluşturmanız gerektiğini düşünüyorum. Daha sonra ProductType içinde, bir CollectionType ProductCategoryType eklersiniz.


Sizin varlık

Eğer ManyToMany ilişkisini kullanmak ve her Varlık üzerinde hiçbir OneToMany, bir diğer tüzel o mach olabilir, doğru değil. Else Doktrini, 2 varlık arasındaki ilişkiyi yapmaz. ManyToMany ilişkisi olan Prouct ve Category varlıklarına sahip olmanız yeterlidir. Size ManyToMany iki yönlü için bir örnek vereceğim.

class Product { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="Category", mappedBy="products") 
    */ 
    private $categories; 

    //.. 


class Category { 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="Product", inversedBy="categories") 
    */ 
    private $products; 

    //.. 

Üründeki bazı yöntemleri eklemek gerekir:.

__construct() { 
    $this->categories = new ArrayCollection(); 
} 

addCategory(Category $category) { 
    $this->categories[] = $category; 
} 

removeCategory(Category $category) { 
    $this->categories->removeElement($caegory); 
} 

getCategories() { 
    return $this->categories(); 
} 

(Kategoriler için de yapın Ürün ve Kategoriye Göre Kategorilerinde Kategori yerine Sonra böyle addCategory yöntemi değiştirebilirsiniz:

addCategory(Category $category) { 
    $this->categories[] = $category; 
    $category->addProduct($this); 
} 

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional

+0

Hayır, hayır, hayır, anlamıyorsunuz, örneğinizle yeni oluşturulan üçüncü tabloya ek alanlar ekleyemiyorum. http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional Neden çoktan çoğa dernekler daha az yaygındır? Sıklıkla, ek öznitelikleri bir ilişkilendirmeyle ilişkilendirmek istediğinizde, bir ilişkilendirme sınıfı tanıtabilirsiniz. Sonuç olarak, doğrudan çoktan çoğa ilişkisi kaybolur ve 3 katılımcı sınıf arasında bire-çok/çoktan bire birlikler tarafından değiştirilir. ' – nacholibre

+0

Üzgünüm, Çok Yönlü bir Öznitelik istediğinizi anlamıyorum, "Öznitelikler" iniz için bazı alanlar ve Kategori'deki bir alan EntityType ile bir ProductCategoryType oluşturmanız gerektiğini düşünüyorum. Daha sonra ProductType içinde, bir ProductText Type TypeType türü ekleyin. – mpiot

İlgili konular