persist()的小问题

时间:2012-06-21 09:22:34

标签: symfony annotations doctrine-orm persistence

我有以下两个实体:

<?php

namespace Site\AnnonceBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Site\UserBundle\Entity\User;

/**
 * Site\AnnonceBundle\Entity\Sujet
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Site\AnnonceBundle\Entity\SujetRepository")
 */
class Sujet
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    //Some code...

    /**
     * 
     * @ORM\ManyToOne(targetEntity="Site\UserBundle\Entity\User")
     */
    private $user;

    //getter/setter....

用户实体(FOSUserBundle):

<?php
namespace Site\UserBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table()
 * 
 */
class User extends BaseUser{


    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;    

    public function getId() {
        return $this->id;
    }


}

当我创建一个“Sujet”时,我制作了(在SujetController.php中):

        $em = $this->getDoctrine()->getEntityManager();
        $sujet->setResolu(false);
        $em->persist($sujet);

        $em->flush();

它的作品,但数据库中插入的“Sujet”引用用户null ...所以在第二个版本中我做了这个:

        $em = $this->getDoctrine()->getEntityManager();
        $sujet->setResolu(false); 
        $sujet->setUser(new User($this->get('session')->get('user_id')))  ;//the user is already in the DB
        $em->persist($sujet);
        $em->flush();

但是我收到了这个错误:

A new entity was found through the relationship 'Site\AnnonceBundle\Entity\Sujet#user' that was not configured to cascade persist operations for entity: . Explicitly persist the new entity or configure cascading persist operations on the relationship. If you cannot find out which entity causes the problem implement 'Site\UserBundle\Entity\User#__toString()' to get a clue.

我不明白,我已经使用过另一个ORM(JPA)并且它以这种方式工作...... 如何告诉“Sujet”有关与数据库中已存在的实体相关的内容?

(对不起,如果我的英语不好)

编辑:它对我有用:

$user = $this->get('security.context')->getToken()->getUser();
$sujet->setUser($user);
$em->persist($sujet);
$em->flush();

1 个答案:

答案 0 :(得分:2)

以防万一,错误来自于您创建了一个新用户并将其链接到sujet而没有持久化的事实(因为没有级联,实体被链接到一个没有持久化的实体,导致错误)。

您的编辑建议您找到一种方法来获取当前用户(这个用户是持久的,与之前的“新用户”不同)。

你也可以做到:

$repository = $this->getDoctrine()
    ->getEntityManager()
    ->getRepository('YourBundle:User');

$user = $repository->find($iduser); 
$sujet->setUser($user);

如果您想“为其他用户”进行编辑,那将是一个很好的解决方案。