2012-09-06 34 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