2013-06-16 2 views
5

ho qualche promblem. ero alla ricerca e provo a suggerire tutti ma nessuno lavora.Doctrine Many to Many Insert

e io alla fine con:

Argument 1 passed to Entity\User::addCategories() must be an instance of Entity\Category, string given,

devo ManyToMany rapporto, utente, user_category, e la categoria

utente

<?php 

namespace Entity; 

use Doctrine\Common\Collections\ArrayCollection; 

use Gedmo\Mapping\Annotation as Gedmo; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @Entity 
* @Table(name="user") 
*/ 
class User 
{ 

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

    /** 
    * @Column(type="string", length=255, unique=true, nullable=false) 
    */ 
    public $name; 


    /** 
    * @ManyToMany(targetEntity="Entity\Category", inversedBy="user") 
    * @ORM\JoinTable(name="user_category") 
    */ 
    public $categories; 

     public function __construct() { 
      $this->category = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

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

    public function addCategories(Category $category = null) 
    { 
     $this->categories = $category; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 
    public function getName() 
    { 
     return $this->name; 
    } 

} 

categoria

<?php 

namespace Entity; 

use Doctrine\Common\Collections\ArrayCollection; 

use Gedmo\Mapping\Annotation as Gedmo; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @Entity 
* @Table(name="category") 
*/ 
class Category 
{ 

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

    /** 
    * @Column(type="string", length=255, unique=true, nullable=false) 
    */ 
    public $name; 

    /** 
    * @ManyToMany(targetEntity="Entity\User", mappedBy="category") 
    */ 
    public $user; 


    public function __construct() { 
     $this->user = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function getUser() 
    { 
     return $this->user; 
    } 

    public function addUser(User $user = null) 
    { 
     $user->addCategory($this); 
     $this->user = $user; 
    } 


    public function setName($name) 
    { 
     $this->name = $name; 
    } 
    public function getName() 
    { 
    return $this->name; 
    } 
} 

funzione Inserisci

 // check existence object in database 
     $res = $this->em->find('Entity\User', $this->input->post('id')); 

     if($res){ 
      $data = $this->em->find('Entity\User', $this->input->post('id')); 
     }else{ 
      // create a new User object 
      $data = new Entity\User;     
     } 


     $data->setName($this->input->post('name')); 
     $data->addCategories($this->input->post('category')); 


     // save the data object to the database 
     $this->em->persist($data); 

     $this->em->flush(); 

Tutto va bene su get ma io sono così confondere per il set al lavoro.

grazie per il vostro aiuto. scusa per il mio inglese.

+0

il metodo addCategory si aspetta un oggetto Category, passandogli invece una stringa. non hai postato quella parte del tuo codice, ma il messaggio di errore lo dice bene – DevZer0

+0

così come il modo giusto per aggiornare questo 3 tavolo? o che tipo devo passare a 'addCategory'? ho provato di tutto e continuo ad affrontare l'errore. – dhidy

+0

aggiorno il mio post, vorresti dargli un'occhiata di nuovo. – dhidy

risposta

8

Hai molti errori (prestare attenzione alla grammatica):

invece di

public $categories; 
public function __construct() { 
    $this->category = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

dovrebbe essere:

protected $categories; 

public function __construct() { 
    $this->categories = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

invece di:

public $user; 
public function __construct() { 
    $this->user = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

utilizzare

protected $users; 
public function __construct() { 
    $this->users = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

Invece di

public function addCategories(Category $category = null) 
{ 
    $this->categories = $category; 
} 

deve essere

public function addCategory(Category $category = null) 
{ 
    $this->categories->add($category); 
} 

e

public function removeCategory(Category $category) 
{ 
    $this->categories->removeElement($category) ; 
} 
public function setCategories($categories) 
{ 
    $this->categories = categories; 
} 

stessa logica su entrambi i lati. Non so come funzioni CI, ma Symfony troverà automaticamente i metodi addSomething/removeSomething. Anche se CI non supporta quella funzione, dovresti comunque cambiare il tuo codice come sopra.