1

我有实体提供者(它只是在身份验证时搜索并为我提供用户的实体存储库),就像这个实体提供者 (MyBundle:Employee 实现 UserInterface 所以没关系)

class EmployeeRepository extends EntityRepository implements UserProviderInterface
{
   public function loadUserByUsername($username)
   {
       $user = $this->getEntityManager()
        ->createQuery("SELECT e FROM MyBundle:Employee e ...")
        ->setParameters(...)->getOneOrNullResult();
        if ($user) {
            return $user;
        }

        throw new UsernameNotFoundException();
    }

    public function refreshUser(UserInterface $user)
    {
        ...

       return $this->find($user->getId());
    }
}

我有另一个实体

class Task {
    ...

    /**
     * @ManyToOne(targetEntity="Employee")
     * @JoinColumn()
     */
    protected $creator;

    ... + setters/getters
}

所以在控制器的某个地方我有:

$task = new Task();
$task->setCreator($this->getUser()) // or $this->get('security.context')->getToken()->getUser();
$em->persist($task);
$em->flush();

我有异常“通过关系'...\Entity\Task#creator'找到了一个新实体,该实体未配置为对实体进行级联持久操作:...\Entity\Employee@0000000066a194ca0000000038e61044。要解决此问题:在此未知实体上显式调用 EntityManager#persist() 或配置级联持续"

但怎么可能:未持久化的实体是由 entityRepository 给出的???(如果坚持 getUser() em 尝试插入新员工)我如何设置任务的创建者?

4

3 回答 3

1

据我了解,您希望能够在 Task 实体上加入 Employee 实体,以了解哪个用户创建了 Task。

如果是这样,您可能应该看看StofDoctrineExtensionBundle ,它允许您在 Symfony2中轻松使用DoctrineExtension 。

DoctrineExtension提供了一个可责备的行为

可责备的行为将自动更新您的实体或文档上的用户名或用户参考字段。它通过注释工作,可以在创建、更新甚至特定属性值更改时更新字段。

namespace Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Article
{
    // ...

    /**
     * @var string $createdBy
     *
     * @Gedmo\Blameable(on="create")
     * @ORM\Column(type="string")
     */
    private $createdBy;

    /**
     * @var string $updatedBy
     *
     * @Gedmo\Blameable(on="update")
     * @ORM\Column(type="string")
     */
    private $updatedBy;

    // ...

    public function getCreated()
    {
        return $this->created;
    }

    public function getUpdated()
    {
        return $this->updated;
    }
}

希望这可以帮助

于 2013-07-05T23:01:16.260 回答
1

我找到了解决方案。

在这段代码中,我使用了实体管理器的新实例,例如 $this->get('doctrine.orm.entity_manager')

$task = new Task();
$task->setCreator($this->getUser())
$em->persist($task);
$em->flush();

,因此新的实体管理器对诸如用户之类的实体一无所知

解决方案是使用默认实体管理器

$em = $this->get('doctrine.orm.default_entity_manager');
...
$em->persist(task);
$em->flush();

工作正常。

于 2013-07-10T07:56:05.200 回答
0

我看不到所有代码,但是如果您想同时插入新任务和新用户(在表单中使用集合类型),您需要在您的实体中定义它(级联注释):

class Task {
    ...

    /**
     * @ManyToOne(targetEntity="Employee", cascade={"persist"})
     * @JoinColumn()
     */
    protected $creator;

    ... + setters/getters
}


有关级联操作的更多信息,请参阅 Doctrine 文档:http ://docs.doctrine-project.org/en/2.0.x/reference/working-with-associations.html#transitive-persistence-cascade-operations

于 2013-07-05T18:07:22.797 回答