我在Administrator
和Role
之间有一个基本的一对多关系。
拥有方是管理员:
/**
* @ORMOneToMany(targetEntity="AppPublicBundleEntityRole", mappedBy="administrator", cascade="persist")
**/
private $roles;
public function __construct() {
$this->roles = new ArrayCollection();
}
相反的一面是角色。
/**
* @ORMManyToOne(targetEntity="AppPublicBundleEntityAdministrator", inversedBy="roles")
* @ORMJoinColumn(name="admin_id", referencedColumnName="admin_id")
**/
private $administrator;
Administrator
可以有许多Roles
,例如 ROLE_ADMIN
或 ROLE_USER
.
以原子方式保存它们的代码是...
$administrator = new Administrator();
$administrator->setName('Mario');
$administrator->setLastname('Superman');
$administrator->setUsername('mario@gmail.com');
$administrator->setPassword('password');
$role_admin = new Role();
$role_admin->setRole('ROLE_ADMIN');
$role_admin->setAdministrator($administrator);
$role_user = new Role();
$role_user->setRole('ROLE_USER');
$role_user->setAdministrator($administrator);
$administrator->setRoles($role_admin);
$administrator->setRoles($role_user);
$em->persist($administrator);
$em->persist($role_user);
$em->persist($role_admin);
$em->flush();
基本的东西。此代码位于通过 Ajax 调用的 Symfony2 控制器中。它抛出了一个Integrity constraint violation
,他说他不能在admin_id
列中输入 null,因为它是 null。它还发出了两个说undefined index role_id
的通知。
奇怪的是,行没有保存,但administrators
表上的admin_id
增加了。
更奇怪的是,我有一个 UnitTest,它做同样的事情(实际上是用相同的代码做同样的事情)并保留实体。
那么代码测试代码如何工作,而实时控制器中的相同代码却不工作呢?
编辑:我通过Ajax调用控制器,它没有得到持久化,但是如果我直接进入使用ajax发出请求的网址,它会被持久化两次。一个用于 ajax post 请求,第二个用于我直接在浏览器上链接时。我在这里错过了一些基本的东西,因为我有一种感觉。
答案是我的数据库被命名为test_suite
mysql认为的测试数据库。我不知道细节,但似乎每个具有类似名称test_
数据库都由 mysql 在特殊规则中重新设置。正如我所说,我不知道细节,但我无法在这种数据库中进行事务插入语句。
当我创建一个名为suit
的新数据库时,一切正常。
这篇博文并没有说测试数据库中禁止事务插入语句,但似乎将数据库命名为test_
是一个坏主意。我不知道这一点,不得不以艰难的方式学习它