php - lazy - many to one
Doctrine2.3 и OneToOne каскадный упор не работает (2)
У меня есть две стороны (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 настроен на сохранение каскада, но это не так. Я здесь что-то не так?
Хорошо нашел решение:
/**
* 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) в качестве первичного ключа для этого.
Ошибка была с
* @ORM\Column(name="user_preferences_id", type="integer")
Ваш код должен содержать
* @ORM\JoinColumn(name="user_preferences_id", referencedColumnName="id")
вместо этого.