2015-01-26 102 views
2

我有一個AdministratorRole之間的基本OneToMany關係。Symfony2和Doctrine Mysql測試數據庫持久性

的擁有方是管理員:

/** 
* @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可以有很多RolesROLE_ADMINROLE_USER

的代碼來保存它們原子是......

$administrator = new Administrator(); 
    $administrator->setName('Mario'); 
    $administrator->setLastname('Superman'); 
    $administrator->setUsername('[email protected]'); 
    $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,因爲它是空的。它還發布了兩條說明undefined index role_id的通知。

奇怪的是,行沒有保存,但administrators表上的admin_id增加。

更奇怪的是我有一個UnitTest可以做同樣的事情(字面意義上是相同的代碼),並堅持實體。

那麼代碼測試代碼如何工作,但實時控制器中的相同代碼卻不行?

編輯:我通過Ajax調用控制器,它不會持續,但如果我直接去使用ajax請求的URL,它會持續兩次。阿賈克斯post請求的第二個,當我直接鏈接到瀏覽器。我在這裏錯過了一些基本的東西,因爲我有一種自我感覺。

回答

1

答案是我的數據庫被命名爲test_suite mysql被認爲是一個測試數據庫。我不知道細節,但似乎每個有名稱的數據庫都是由特殊規則的mysql調用的。正如我所說,我不知道細節,但我不能在這種數據庫中創建事務性插入語句。

當我創建一個名爲suit的新數據庫時,一切正常。

This blog post 並沒有說在測試數據庫中禁止事務性插入語句,但似乎將數據庫的名稱命名爲test_似乎是個好主意。我不知道這一點,並不得不努力學習它