php - lazy - doctrine one to one nullable



Doctrine2.3 и OneToOne каскадный упор не работает (2)

Хорошо нашел решение:

/**
 * User
 *
 * @ORM\Table("users")
 * @ORM\Entity
 */
class User extends UserEntity
{
    ...

    /**
     * @ORM\OneToOne
     * (
     *      targetEntity="UserPreferences",
     *      cascade={"persist", "remove"},
     *      inversedBy="user"
     * )
     */
    protected $userPreferences;
}

/**
 * @ORM\Table("user_preferences")
 * @ORM\Entity
 */
class UserPreferences extends UserPreferencesEntity
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @var int
     *
     * @ORM\OneToOne(targetEntity="User", mappedBy="id", cascade={"persist", "remove"})
     */
    protected $user;

    ...
}

Прежде всего, мне нужно было указать mappedBy и inversedBy (который я уже пробовал раньше, но не в том направлении), сопоставленный на стороне владельца, inversedBy на обратной стороне). Также я думал, что обратной стороне не нужно иметь отдельный идентификатор, и я попытался использовать идентификатор владельца (User # id) в качестве первичного ключа для этого.

https://src-bin.com

У меня есть две стороны (User и UserPreferences), которые я хочу сопоставить OneToOne однонаправленным.

Код выглядит примерно так:

/**
 * @ORM\Table("users")
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     */
    protected $id;

    ...

    /**
     * @ORM\Column(name="user_preferences_id", type="integer")
     * @ORM\OneToOne
     * (
     *      targetEntity="UserPreferences",
     *      cascade={"persist"}
     * )
     */
    protected $userPreferences;

    public function __construct() {
        $this->userPreferences = new UserPreferences();
    }
}


/**
 * @ORM\Table("user_preferences")
 * @ORM\Entity
 */
class UserPreferences extends UserPreferencesEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(name="user_id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    ...
}

Теперь, когда создается новый пользователь, userPreferences инициализируется новым объектом UserPreferences. При попытке сохранить user , Doctrine выбрасывает исключение, требуя

A new entity was found through the relationship '...\Entity\User#userPreferences' that was not configured to cascade persist operations for entity: ...\Entity\[email protected] To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).

Но что еще мне делать? Пользователь # userPreferences настроен на сохранение каскада, но это не так. Я здесь что-то не так?


Answer #1

Ошибка была с

 * @ORM\Column(name="user_preferences_id", type="integer")

Ваш код должен содержать

 * @ORM\JoinColumn(name="user_preferences_id", referencedColumnName="id")

вместо этого.