Когда я запускаю следующую команду: php app/console doctrine:schema:update --force --dump-sql
Возвращает это сообщение: Nothing to update - your database is already in sync with the current entity metadata
,
У меня есть две сущности, User и UserProfile.
User.php
/**
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\OneToOne(targetEntity="UserProfile", inversedBy="user_id")
*/
private $id;
...
UserProfile.php
/**
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM\Id
* @ORM\Column(name="user_id", type="integer")
* @ORM\OneToOne(targetEntity="User", mappedBy="id")
*/
private $userId;
...
Я уже пытался очистить кеш.
ОБНОВЛЕНИЕ № 1
User.php
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\OneToOne(targetEntity="UserProfile", mappedBy="userId")
*/
private $id;
UserProfile.php
/**
* @ORM\Id
* @ORM\Column(name="user_id", type="integer")
* @ORM\OneToOne(targetEntity="User", inversedBy="id")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $userId;
У вас есть несколько вариантов здесь, если вы хотите двунаправленную ассоциацию, то есть вы хотите иметь возможность доступа к другому объекту из любого из них, тогда вы захотите использовать другое свойство (НЕ $id
) чтобы достичь этого. Что-то вроде:
/**
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="UserProfile", mappedBy="userId")
*/
private $profile;
...
}
Затем в UserProfile.php
/**
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="profile")
* @ORM\JoinColumn(name="userId", referencedColumnName="id")
*/
private $user;
...
}
Это позволит вам сделать $userProfile->getUser()
а также $user->getProfile()
,
Если вы хотите использовать userId в качестве основного ключа для таблицы UserProfile, вы можете просто потребовать больше усилий для его настройки, и вам придется явно установить его в своем приложении. Проще просто сослаться на это на другом поле.
однонаправленный
User.php
/**
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
UserProfile.php
/**
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="profile")
* @ORM\JoinColumn(name="userId", referencedColumnName="id")
*/
private $user;
...
}
Это только позволит вам сделать $userProfile->getUser()
, Скорее всего, не то, что вы ищете. Другое однонаправленное решение — от объекта пользователя к UserProfile, например:
/**
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="UserProfile", mappedBy="id")
*/
private $profile;
...
}
Затем в UserProfile.php
/**
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
Таким образом, вы можете сделать $user->getProfile()
,
inversedBy ссылается на свойство, а не на поле базы данных.
+ Изменить inversedBy="user_id"
в inversedBy="userId"
Вы также должны использовать JoinColumn, а не Column и referencedColumnName согласно документации: