Doctrine2: PDOException [23000]: SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись «Для проверки подлинности» для ключа «имя» - PullRequest
1 голос
/ 18 февраля 2011

У меня есть следующие модели:

UserStatus:

<?php
namespace Base;

/** @Entity @Table(name="user_status") */
class UserStatus extends \Skeleton\Base {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /** @Column(length="256") */
    protected $name;

    /**
     * @OneToMany(targetEntity="Base\User", mappedBy="Status")
     */
    protected $Users;
}

Пользователь:

<?php
namespace Base;

/**
 * @Entity 
 * @Table(name="user")
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discriminator", type="string")
 * @DiscriminatorMap({
 *          "admin"         = "Administrator", 
 *          "participant"   = "Participant", 
 *          "employee"      = "Employee" 
 * })
 */
class User extends \Skeleton\Skeleton implements Interfaces\User {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ManyToOne(targetEntity="UserStatus", inversedBy="Users")
     * @JoinColumn(name="status_id", referencedColumnName="id")
     */
    protected $Status;

    /** @Column(length=255) */
    protected $username;

    /** @Column(length=255) */
    protected $password;

    /** @Column(length=255) */
    protected $firstname;

    /** @Column(length=128) */
    protected $insertion;

    /** @Column(length=255) */
    protected $lastname;

    /** @Column(type="datetime") */
    protected $created;

    /** @Column(type="integer", name="creator_id") */
    protected $Creator;

    /** @Column(type="datetime") */
    protected $modified;

    /** @Column(type="integer", name="modifier_id") */
    protected $Modifier;
}

И следующий код контроллера:

$Employee = new \Base\User();
$Employee->username = "Employee";
$Employee->password = "Just an encrypted password";
$Employee->firstname = "Just";
$Employee->insertion = "a";
$Employee->lastname = "Employee";

$UserStatus = \Base\UserStatus::getById(1);
$Employee->Status = $UserStatus;

$UserStatus->Users->add($Employee);

$em = \Doctrine\Configure\EntityManager::instance();
$em->persist($UserStatus);
$em->persist($Employee);
$em->flush();

Код контроллера дает мне:

PDOException [ 23000 ]: SQLSTATE[23000]: Integrity constraint violation: 1062 
Duplicate entry 'To be authenticated' for key 'name'

Само собой разумеется, но имя загруженного UserStatus - «Для аутентификации». Каким-то образом он пытается вставить UserStatus в базу данных вместо сохранения отношения OneToMany UserStatus.

Может кто-нибудь сказать мне, что не так с этим кодом?

@ beberlei: Когда я удаляю эту строку, я получаю другую ошибку:

InvalidArgumentException [ 0 ]: A new entity was found through a relationship that was
not configured to cascade persist operations: Base\UserStatus@00000000485b93d40000000031ebec33. Explicitly persist the new entity or 
configure cascading persist operations on the relationship.

Ответы [ 2 ]

1 голос
/ 19 февраля 2011

Я нашел решение. Мой $ entityManager не был единственным. Это означает, что $UserStatus был загружен другим экземпляром управления данными, чем тот, с которым я пытался его сохранить. Тот, с кем я пытался его сохранить, еще не знал $ UserStatus, поэтому он попытался вставить его. Сделав мой \Doctrine\Configure\EntityManager::instance() возврат единственного экземпляра управления данными, проблема была решена.

1 голос
/ 19 февраля 2011

Вы вызываете $ em-> persist ($ userStatus) для объекта, который уже управляется. Этот метод только для новых лиц. Я не уверен, что это решит проблему.

...