Я создаю некоторые Fixtures
в Symfony2, используя Doctrine. Я получаю следующую ошибку:
Integrity constraint violation: 1062 Duplicate entry '206-411' for key 'PRIMARY'
когда я пытаюсь сохранить однонаправленную ассоциацию "многие ко многим".
Я понимаю ошибку, но я запутался: разве не очевидно, что некоторые идентификаторы дублируются в отношении "многие ко многим"?
Если я ошибаюсь, поправьте меня. Я помещаю свой код ниже, любые разъяснения приветствуются.
Файл исправления:
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();
}
}
Объявление отношений в классе курса:
/**
* @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
перед попыткой создать ассоциацию.
Если я попытаюсь вставить только одного студента на курс, все будет работать гладко.