【问题标题】:Doctrine & Symfony2 - Integrity constraint violation: 1062 Duplicate entry 'x-y' for key 'PRIMARYDoctrine & Symfony2 - 完整性约束违规:1062 键 'PRIMARY 的重复条目 'x-y'
【发布时间】:2015-08-13 08:32:55
【问题描述】:


我正在使用 Doctrine 在 Symfony2 中创建一些 Fixtures。我收到以下错误:

Integrity constraint violation: 1062 Duplicate entry '206-411' for key 'PRIMARY'

当我尝试保持多对多单向关联时。
我理解这个错误,但我很困惑:在多对多关系中某些 ID 是重复的不是很明显吗?
如果我错了,请纠正我。我把我的代码放在下面,欢迎任何澄清。

夹具文件:

namespace sociaLecomps\SuperBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\Query;

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;


class LoadAssociationsData extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    private $container;

    public function setContainer(ContainerInterface $container = null){
        $this->container = $container;
    }

    public function load(ObjectManager $manager)
    {
        $em = $this->container->get('doctrine')->getManager('default');

        /*
         * COURSE - STUDENT ASSOCIATION
         */

        $courses = $em->createQuery('SELECT c FROM sociaLecompsSuperBundle:Course c')->getResult();
        $students = $em->createQuery('SELECT s FROM sociaLecompsSuperBundle:Student s')->getResult();

        $i=0;
        for($j=0; $j<count($courses); $j++){

            $course = $courses[$j];

            //here I'm adding two different students to the same course
            $s = array($students[$i], $students[$i++]);
            $course->setSubscribedStudents($s);
            $em->persist($course);

            $i++;
        }
        $manager->flush();

    }
}

Course 类中的关系声明:

/**
     * @ORM\ManyToMany(targetEntity="Student")
     * @ORM\JoinTable(name="relation_course_student",
     *      joinColumns={@ORM\JoinColumn(name="course_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="student_id", referencedColumnName="id")}
     *      )
     **/
    private $subscribed_students;

    public function __construct() {
        $this->subscribed_students = new ArrayCollection();
    }

在尝试创建关联之前,已创建实体 Student 和 Course,也使用 Fixtures
如果我尝试每门课程只插入一名学生,一切都会顺利进行。

【问题讨论】:

    标签: symfony doctrine fixture


    【解决方案1】:

    我看到您的课程实体已经存在,因为您直接从数据库 ($courses = $em-&gt;createQuery('SELECT c FROM sociaLecompsSuperBundle:Course c')-&gt;getResult();) 中获取它们。所以你不应该再次尝试持久化实体。我建议你这样使用merge()

    $em->merge($course);
    

    注 1: 我看到您在这里使用 Doctrine 固定装置,并且已经创建了学生和课程。如果它们是通过 Doctrine 固定装置创建的,请考虑使用 addReferencegetReference 方法。此处示例:https://github.com/doctrine/data-fixtures/blob/master/README.md#sharing-objects-between-fixtures

    注意 2:您也没有在 subscribed_students 关联中设置 级联 选项。既然学生已经存在,应该不是问题。否则,您也可以设置级联选项或在学生实体上运行merge|persist

    【讨论】:

    • 注明。感谢您的提示^^
    【解决方案2】:

    那是最愚蠢的事情。
    我换了:

    $s = array($students[$i], $students[$i++]);
    

    $s = array($students[$i], $students[++$i]);
    

    由于是后增量,第二次插入尝试将同一个学生放入数据库中,结果是完全相同的行重复。

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多