So I'm building a message system to my website, I've got Message entity which has realtion many-to-many with Inbox, which should store message_id and receiver_id. It's beacouse user should be able to send message to many users
I've done all relations, but, when form is submitted i get error:
Expected value of type "Doctrine\Common\Collections\Collection|array" for association field "DEERCMS\MessageBundle\Entity\Message#$receiver", got "PTB\UserBundle\Entity\User" instead.
Here's form, it has 'multiple' => true
beacause as I said, the user should be able to sent message to many other users
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);
}
And my entities Message
/**
* 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
/**
* 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;
}
}
I solved it by myself. So basiccly the target Entity was wrong, the relation should be defined between message and User, here's how it look like
/**
* @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;