I am trying to set up a one-to-many / many-one association in Doctrine 2.0. Since I need a “read” field in the user_message association table, I have 3 objects.
User.php
namespace Console\Entity; use Doctrine\Common\Collections\ArrayCollection; class User { protected $id; protected $messages; public function __construct(){ $this->messages = new ArrayCollection(); } public function addMessage(Message $message){ $message->addUser($this); $this->messages[] = $message; } }
message.php
namespace Console\Entity; use Doctrine\Common\Collections\ArrayCollection; class Message { protected $id; protected $value; protected $users; public function __construct(){ $this->users = new ArrayCollection(); } public function addUser(User $user){ $this->users[] = $user; } }
UserMessage.php
namespace Console\Entity; class UserMessage { protected $id; protected $userId; protected $messageId; protected $isRead; public function isRead(){ return $this->isRead; } public function setIsRead($flag = true){ $this->isRead = (bool)$flag; } }
dump.sql (generated from doctrine)
CREATE TABLE IF NOT EXISTS `message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type_id` int(11) DEFAULT NULL, `value` longtext NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `IDX_B6BD307FC54C8C93` (`type_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip_id` int(11) DEFAULT NULL, `username` varchar(50) NOT NULL, `password` varchar(64) NOT NULL, `created` datetime NOT NULL, `last_action` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `UNIQ_8D93D649F85E0677` (`username`), UNIQUE KEY `UNIQ_8D93D649A03F5E9F` (`ip_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; CREATE TABLE IF NOT EXISTS `user_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `message_id` int(11) NOT NULL, `is_read` tinyint(1) NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; ALTER TABLE `message` ADD CONSTRAINT `message_ibfk_1` FOREIGN KEY (`type_id`) REFERENCES `message_type` (`id`); ALTER TABLE `user` ADD CONSTRAINT `user_ibfk_1` FOREIGN KEY (`ip_id`) REFERENCES `ip` (`id`);
And now my test:
$user = $em->find('Console\Entity\User', 1); $message = new Console\Entity\Message(); $message->setValue('TestNachricht'); $user->addMessage($message); $em->persist($user); $em->flush();
What happens: the message table is full, user_message is empty. What can I do to use the user_message table and what do I need to do to set the message “how”?
thanks for the help