我在Administrator
和Role
之间存在基本的OneToMany关系。
拥有方是管理员:
/**
* @ORM\OneToMany(targetEntity="App\PublicBundle\Entity\Role", mappedBy="administrator", cascade="persist")
**/
private $roles;
public function __construct() {
$this->roles = new ArrayCollection();
}
反面是角色。
/**
* @ORM\ManyToOne(targetEntity="App\PublicBundle\Entity\Administrator", inversedBy="roles")
* @ORM\JoinColumn(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
的通知。
奇怪的是,没有保存行,但admin_id
表上的administrators
会增加。
更奇怪的是,我有一个UnitTest做同样的事情(字面意思是相同的代码),并坚持实体。
那么代码测试代码如何工作但实时控制器中的相同代码却没有?
编辑:我通过Ajax调用控制器并且它不会被持久化但是如果我直接使用ajax发出请求的url,它会持续两次。当我直接在浏览器上链接时,ajax发布请求和第二次请求。我错过了一些基本的东西,因为我有一种感觉,我是。答案 0 :(得分:1)
答案是我的数据库被命名为test_suite
mysql认为是测试数据库。我不知道细节,但似乎每个具有test_
名称的数据库都由mysql在特殊规则中进行了注册。正如我所说,我不知道细节,但我无法在那种数据库中创建事务性插入语句。
当我创建一个名为suit
的新数据库时,一切正常。
This blog post
并没有说测试数据库中禁止使用事务性插入语句,但似乎将数据库命名为test_
似乎是个坏主意。我不知道这一点,并且必须以艰难的方式学习它