Doctrine & Symfony2 - 违反完整性约束:1062 键 'PRIMARY 的重复条目 'x-y'
Doctrine & Symfony2 - Integrity constraint violation: 1062 Duplicate entry 'x-y' for key 'PRIMARY
我正在使用 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();
}
}
课程中的关系声明class:
/**
* @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();
}
在尝试创建关联之前,也使用 Fixtures
创建了学生和课程实体。
如果我尝试在每门课程中只插入一名学生,一切都会顺利进行。
我看到您的课程实体已经存在,因为您是直接从数据库中获取它们 ($courses = $em->createQuery('SELECT c FROM sociaLecompsSuperBundle:Course c')->getResult();
)。因此,您不应该再次尝试保留该实体。我建议你这样使用 merge()
:
$em->merge($course);
注1:
我看到你在这里使用 Doctrine fixtures 并且已经创建了学生和课程。如果它们是通过 Doctrine fixture 创建的,也可以考虑使用 addReference
和 getReference
方法。此处示例:https://github.com/doctrine/data-fixtures/blob/master/README.md#sharing-objects-between-fixtures
注意 2: 此外,您没有在 subscribed_students
关联中设置 级联 选项。既然学生已经存在,应该不是问题。否则,您也可以在学生实体上设置级联选项或 运行 a merge
|persist
。
那是最愚蠢的事情。
我替换了:
$s = array($students[$i], $students[$i++]);
和
$s = array($students[$i], $students[++$i]);
因为它是一个 post-增量,第二次插入试图将同一个学生放入数据库,导致精确的行重复。
希望这对某人有所帮助。
我正在使用 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();
}
}
课程中的关系声明class:
/**
* @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();
}
在尝试创建关联之前,也使用 Fixtures
创建了学生和课程实体。
如果我尝试在每门课程中只插入一名学生,一切都会顺利进行。
我看到您的课程实体已经存在,因为您是直接从数据库中获取它们 ($courses = $em->createQuery('SELECT c FROM sociaLecompsSuperBundle:Course c')->getResult();
)。因此,您不应该再次尝试保留该实体。我建议你这样使用 merge()
:
$em->merge($course);
注1:
我看到你在这里使用 Doctrine fixtures 并且已经创建了学生和课程。如果它们是通过 Doctrine fixture 创建的,也可以考虑使用 addReference
和 getReference
方法。此处示例:https://github.com/doctrine/data-fixtures/blob/master/README.md#sharing-objects-between-fixtures
注意 2: 此外,您没有在 subscribed_students
关联中设置 级联 选项。既然学生已经存在,应该不是问题。否则,您也可以在学生实体上设置级联选项或 运行 a merge
|persist
。
那是最愚蠢的事情。
我替换了:
$s = array($students[$i], $students[$i++]);
和
$s = array($students[$i], $students[++$i]);
因为它是一个 post-增量,第二次插入试图将同一个学生放入数据库,导致精确的行重复。
希望这对某人有所帮助。