3


FixturesDoctrineを使用してSymfony2で いくつか作成しています。次のエラーが表示されます。

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();
    }

Fixtures関連付けを作成しようとする前に、エンティティ Student および Course も で作成されます。
コースごとに 1 人の学生だけを挿入しようとすると、すべてスムーズに機能します。

4

2 に答える 2

2

データベースから直接コース エンティティを取得しているため、コース エンティティが既に存在しているように見えます ( $courses = $em->createQuery('SELECT c FROM sociaLecompsSuperBundle:Course c')->getResult();)。したがって、エンティティをもう一度永続化しようとするべきではありません。このように使用することをお勧めしますmerge()

$em->merge($course);

注 1: ここでは Doctrine フィクスチャを使用しており、学生とコースは既に作成されているようです。それらが Doctrine フィクスチャを介して作成されている場合は、addReferenceおよびgetReferenceメソッドの使用も検討してください。例: https://github.com/doctrine/data-fixtures/blob/master/README.md#sharing-objects-between-fixtures

注 2:また、関連付けにカスケードオプションが設定されていませんsubscribed_students。学生はすでに存在するため、問題になることはありません。それ以外の場合は、cascade オプションを設定するか、merge|を実行できます。persist学生エンティティでも。

于 2015-08-13T08:36:37.423 に答える