2016-10-24 4 views
0

Так я строит систему сообщений на мой сайт, я получил сообщение лицо, которое имеет realtion многие-ко-многим с Входящие, который должен хранить message_id и receiver_id. Это beacouse пользователь должен иметь возможность отправить сообщение многих пользователейSymfony3 многие-ко-многим realtion, когда форма имеет EntityType

я сделал все отношения, но, когда форма была отправлена, я получаю сообщение об ошибке:

Expected value of type "Doctrine\Common\Collections\Collection|array" for association field "DEERCMS\MessageBundle\Entity\Message#$receiver", got "PTB\UserBundle\Entity\User" instead.

Вот форма, она имеет 'multiple' => true обусловленно, как Я сказал, пользователь должен иметь возможность отправленного сообщения для многих других пользователей

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
      ->add('receiver', EntityType::class, array(
       'class' => 'PTBUserBundle:User', 
       'choice_label' => 'email', 
       'multiple' => true, 
       'expanded' => false,  
      )) 
      ->add('title') 
      ->add('message', TextareaType::class); 
} 

И мои Entities сообщения

/** 
* Message 
* 
* @ORM\Table() 
* @ORM\Entity() 
*/ 

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

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $sender; 

    /** 
    * @ORM\ManyToMany(targetEntity="DEERCMS\MessageBundle\Entity\Inbox") 
    * @ORM\JoinTable(name="message_receivers", 
    *  joinColumns={@ORM\JoinColumn(name="message_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="receiver_id", referencedColumnName="id", unique=true)} 
    *  ) 
    */ 
    private $receiver; 
    /** 
    * @ORM\Column type="string") 
    */ 
    private $title; 

    /** 
    * @ORM\Column(type="string", length=4000) 
    */ 
    private $message; 

    /** 
    * @ORM\Column(type="date") 
    */ 
    private $date; 

    /** 
    * @ORM\Column(type="boolean") 
    */ 
    private $displayed; 


    public function __construct() 
    { 
     $this->date = new \DateTime(); 
     $this->receiver = new \Doctrine\Common\Collectionsn\ArrayCollection(); 
    } 

    //...  

    /** 
    * Set sender 
    * 
    * @param integer $sender 
    * 
    * @return Message 
    */ 
    public function setSender($sender) 
    { 
     $this->sender = $sender; 

     return $this; 
    } 

    /** 
    * Get sender 
    * 
    * @return int 
    */ 
    public function getSender() 
    { 
     return $this->sender; 
    } 

    /** 
    * Set receiver 
    * 
    * @param integer $receiver 
    * 
    * @return Message 
    */ 
    public function setReceiver($receiver) 
    { 
     $this->receiver = $receiver; 

     return $this; 
    } 

    /** 
    * Get receiver 
    * 
    * @return int 
    */ 
    public function getReceiver() 
    { 
     return $this->receiver; 
    } 



    /** 
    * Add receiver 
    * 
    * @param \DEERCMS\MessageBundle\Entity\Inbox $receiver 
    * 
    * @return Message 
    */ 
    public function addReceiver(\DEERCMS\MessageBundle\Entity\Inbox $receiver) 
    { 
     $this->receiver[] = $receiver; 

     return $this; 
    } 

    /** 
    * Remove receiver 
    * 
    * @param \DEERCMS\MessageBundle\Entity\Inbox $receiver 
    */ 
    public function removeReceiver(\DEERCMS\MessageBundle\Entity\Inbox $receiver) 
    { 
     $this->receiver->removeElement($receiver); 
    } 
} 

Входящие

/** 
* Inbox 
* 
* @ORM\Table(name="inbox") 
* @ORM\Entity(repositoryClass="DEERCMS\MessageBundle\Repository\InboxRepository") 
*/ 
class Inbox 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

ответ

1

Я решил это сам. Таким образом, базовая цель Entity была неправильной, отношение должно быть определено между сообщением и пользователем, вот как это выглядит:

/** 
* @ORM\ManyToMany(targetEntity="PTB\UserBundle\Entity\User") 
* @ORM\JoinTable(name="message_receivers", 
*  joinColumns={@ORM\JoinColumn(name="message_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", unique=true)} 
*  ) 
*/ 
private $user; 
+0

Можете ли вы пометить свой ответ как принятый? – Veve

+0

@Veve У меня есть уведомление «Вы можете принять свой собственный ответ завтра». Так что я сделаю это, завтра :) – misterlewy1