2012-09-06 35 views
1

我有一個系統,採取詳細描述項目的表單信息,將其添加到項目表,並且是爲了添加一個條目到分配的項目表中以將用戶與項目相關聯(這一點是允許每個項目有多個用戶)。無論如何,我在沒有外鍵的情況下工作,努力添加它們,但最終得到了它們。Symfony2 Doctrine2列被設置爲空

不幸的是,這個額外的錯誤導致了這個錯誤:SQLSTATE [23000]:完整性約束違規:1048只要有東西被添加到assignedProjects表中,column'projectId'就不能爲空'。

所以我的問題是,我錯過了我的代碼中的東西?

代碼到一個新的行添加到assignedProjects:

$assignedProject = new AssignedProjects(); 
$assignedProject->setProjectId($project->getId()); 
$assignedProject->setUserId($user[0]['id']); 
$em = $this->getDoctrine()->getEntityManager(); 
$em->persist($assignedProject); 
$em->flush(); 

爲assignProjects實體代碼: 類AssignedProjects { /** * 整數@var $ ID * * @ORM \ Column(name =「id」,type =「integer」) * @ORM \ Id * @ORM \ GeneratedValue(strategy =「AUTO」) */ private $ id;

/** 
* @var integer $projectId 
* 
* @ORM\Column(name="projectId", type="integer") 
*/ 
private $projectId; 

/** 
* @ORM\ManyToOne(targetEntity="Projects", inversedBy="assignment") 
* @ORM\JoinColumn(name="projectId", referencedColumnName="id") 
*/ 
private $project; 


/** 
* @var integer $UserId 
* 
* @ORM\Column(name="userId", type="integer") 
*/ 
private $userId; 

/** 
* @ORM\ManyToOne(targetEntity="Dev\UserBundle\Entity\User", inversedBy="assignment") 
* @ORM\JoinColumn(name="userId", referencedColumnName="id") 
*/ 
private $user; 

(其次是常用的getter和setter)

和項目表的實體是:

class Projects 
{ 
/** 
* @var integer $id 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string $projectName 
* 
* @ORM\Column(name="projectName", type="string", length=255) 
*/ 
private $projectName; 


/** 
* @ORM\OneToMany(targetEntity="AssignedProjects", mappedBy="project") 
*/ 
protected $assignment; 

任何幫助,將不勝感激!

回答

0

要麼你使用ProjectId和UserId列,並手動管理關係(不推薦)或者使用原則關係(推薦),但不要做這兩件事。如果你選擇第二個選項,不要包含projectId和userId列,它們是根據教義自動爲你創建的。所以,你的AssignedProjects類應該是:

class AssignedProjects { 
/** 
* @var integer $id 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="Projects", inversedBy="assignment") 
* @ORM\JoinColumn(name="projectId", referencedColumnName="id") 
*/ 
private $project; 


/** 
* @ORM\ManyToOne(targetEntity="Dev\UserBundle\Entity\User", inversedBy="assignment") 
* @ORM\JoinColumn(name="userId", referencedColumnName="id") 
*/ 
private $user; 

,並在你的控制器,你會怎麼做:

$assignedProject = new AssignedProjects(); 
$assignedProject->setProject($project); 
$assignedProject->setUser($user[0]); 
$em = $this->getDoctrine()->getEntityManager(); 
$em->persist($assignedProject); 
$em->flush(); 

注意,我設置的項目和用戶領域,而不是IDS

由除非你需要保存額外的關於這個項目分配的數據(比如日期或者類似的東西),你可以在User和Project之間聲明一個ManyToMany關係並且廢除這個類,Doctrine會自己生成所需的表

+0

謝謝,非常有幫助!而且我打算添加日期等其他位,但爲提示而歡呼! –

0

使用Doctrine2,您不必聲明外鍵(projectId),而只需聲明關聯(項目)。所以你可以刪除$projectId屬性,以及setProjectId ans getProjectId方法。同樣修爲$用戶...

相反,你會使用setProject這樣的:

$assignedProject = new AssignedProjects(); 
$assignedProject->setProject($project); 
$assignedProject->setUser($user[0]); 
$em = $this->getDoctrine()->getEntityManager(); 
$em->persist($assignedProject); 
$em->flush(); 

,看一下Doctrine2文件,它會幫助你,肯定的! http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html