简体   繁体   中英

Symfony3 many-to-many realtion when form has entitytype

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM