доктрина: схема: обновление не создает отношения OneToOne

Когда я запускаю следующую команду: 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;

1

Решение

У вас есть несколько вариантов здесь, если вы хотите двунаправленную ассоциацию, то есть вы хотите иметь возможность доступа к другому объекту из любого из них, тогда вы захотите использовать другое свойство (НЕ $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(),

0

Другие решения

inversedBy ссылается на свойство, а не на поле базы данных.

+ Изменить inversedBy="user_id" в inversedBy="userId"

Вы также должны использовать JoinColumn, а не Column и referencedColumnName согласно документации:

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-one-unidirectional

0

По вопросам рекламы [email protected]