Symfony2 Doctrine2列设置为null

时间:2012-09-06 12:28:36

标签: symfony doctrine-orm many-to-one

我有一个系统,它接受详细说明项目的表单信息,将其添加到项目表中,并且意味着将一个条目添加到指定的项目表中以将用户与项目相关联(这点允许每个项目允许多个用户) 。无论如何,我在没有外键的情况下工作,努力添加它们但最终得到它们。

不幸的是,此附加功能导致此错误'SQLSTATE [23000]:完整性约束违规:1048只要将某些内容添加到assignedProjects表,列'projectId'就不能为null。

所以我的问题是,我的代码中遗漏了什么吗?

将新行添加到assignedProjects的代码:

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

assignProjects实体的代码:     class AssignedProjects     {     / **      * @var integer $ id      *      * @ORM \ Column(name =“id”,type =“integer”)      * @ORM \ Id      * @ORM \ GeneratedValue(strategy =“AUTO”)      * /     私人$ 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;

(其次是通常的吸气者和制定者)

,项目表实体是:

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;

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用ProjectId和UserId列并手动管理关系(不推荐),也可以使用学说关系(推荐),但不要同时执行这两项操作。如果您选择第二个选项,请不要包含projectId和userId列,它们将由doctrine自动为您创建。所以,你的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将生成所需的表格本身

答案 1 :(得分:0)

使用Doctrine2,您不必声明外键(projectId),只需声明关联(项目)。因此,您可以删除$projectId属性以及setProjectId ans getProjectId方法。 $ user的相同修复...

相反,您将使用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