【问题标题】:Symfony2 Doctrine2 column being set to nullSymfony2 Doctrine2 列被设置为空
【发布时间】:2012-08-31 06:39:48
【问题描述】:

我有一个系统,该系统采用详细说明项目的表单信息,将其添加到项目表中,并且旨在将条目添加到分配的项目表中以将用户与项目相关联(这一点是允许每个项目有多个用户) .无论如何,我在没有外键的情况下完成了这项工作,努力添加它们但最终得到了它们。

不幸的是,每当向assignedProjects 表中添加某些内容时,此附加内容都会导致此错误“SQLSTATE[23000]:完整性约束违规:1048 列“projectId”不能为空”。

所以我的问题是,我是否遗漏了代码中的某些内容?

向assignedProjects添加新行的代码:

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

assignProjects 实体的代码: 类分配项目 { /** * @var 整数 $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;

(后面是通常的 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;

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    您要么使用 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();
    

    请注意,我设置的是项目和用户字段,而不是 ID

    顺便说一句,除非您需要保存有关此项目分配的额外数据(例如日期或类似内容),否则您可以在 User 和 Project 之间声明直接的 ManyToMany 关系并取消此类,Doctrine 将生成所需的单独的表

    【讨论】:

    • 谢谢,很有帮助!我确实打算添加其他内容,例如日期,但为小费欢呼!
    【解决方案2】:

    使用 Doctrine2,您不必声明外键 (projectId),而只需声明关联 (project)。所以你可以删除$projectId 属性,以及setProjectIdgetProjectId 方法。 $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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多