Доктрина и Symfony2: Ассоциация относится к обратной стороне, которая не существует ошибки
У меня есть страница address.html.twig, пользователь может добавить много адресов в таблицу UserAddress. когда он добавил свой адрес в базу данных, адрес должен отображаться на той же странице, на которой он добавил свой адрес, тогда он может выбрать, какой из них он хотел бы использовать. К сожалению, адрес не отображается.
Сначала я подумал, что у меня проблема в действиях контроллера или на странице веток. Я даже задал вопрос здесь об этом => здесь
Я проверил все мои таблицы в phpmyadmin, и все они хорошо связаны, но если я делаю это: php app/console doctrine:schema:validate, у меня есть эта ошибка:
[Mapping] FAIL - недопустимое отображение класса сущности 'FLY\BookingsBundle\Entity\Commandes': * Ассоциация FLY\BookingsBundle\Entity\Commandes#user ссылается на поле обратной стороны Application\Sonata\UserBundle\Entity\User# командиры которых не существует.
[Mapping] FAIL - недопустимое отображение класса сущности 'FLY\BookingsBundle\Entity\UserAddress': * Ассоциация FLY\BookingsBundle\Entity\UserAddress#user ссылается на поле обратной стороны Application\Sonata\UserBundle\Entity\User# адрес, который не существует.
Посмотрите на эту картинку:
Это мой UserAddress.php
/**
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="address")
* @ORM\JoinColumn(nullable=true)
*/
private $user;
Commandes.php
/**
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="commandes")
* @ORM\JoinColumn(nullable=true)
*/
private $user;
User.php
/**
* @ORM\Entity(repositoryClass="FLY\UserBundle\Repository\UserRepository")
* @ORM\Table(name="fos_user_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
$this->commandes = new \Doctrine\Common\Collections\ArrayCollection();
$this->address = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* @ORM\OneToMany(targetEntity="FLY\BookingsBundle\Entity\Commandes", mappedBy="user", cascade={"remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $commandes;
/**
* @ORM\OneToMany(targetEntity="FLY\BookingsBundle\Entity\UserAddress", mappedBy="user", cascade={"remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $address;
Здесь вы можете увидеть мой вар-дамп:
User {#124 ▼
#id: 21
-commandes: null
-address: null
}
2 ответа
У меня была проблема, которая появлялась 2-3 раза за последние несколько лет, когда сопоставления были неправильными, но обновление схемы прошло успешно. После того, как сопоставления были исправлены, это не было отражено в схеме, и Symfony предположил, что оно уже обновлено.
Я рекомендую вам попробовать удалить соответствующие отношения вручную из ваших таблиц пользователей, команд и адресов, а затем запустить:
php app/console doctrine:schema:update --force
- это может исправить вашу проблему.
Вполне вероятно, что ни с кем другого такого не случится, но шанс есть.
В моем случае эта ошибка возникла из-за наличия дубликата. У моей сущности было 2 поля, которыеManyToOne
отношения. И у них обоих были одинаковые перевернутые имена, что и привело к этой ошибке.
Итак, это соответствующий фрагмент кода:
class TaskIngredient
{
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Ingredient", inversedBy="taskIngredients")
* @ORM\JoinColumn(nullable=false)
*/
private $ingredient;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Task", inversedBy="taskIngredients")
* @ORM\JoinColumn(nullable=false)
*/
private $task;
}
Решение было относительно простым. Я попытался изменитьinversedBy
имя, вручную. Однако это не помогло (даже после примененияphp app/console doctrine:schema:update --force
и удаление var/cache
папка).
Так что я просто:
- Удален один из проблемных объектов (и его сеттер / получатель)
- Прогнал
php bin/console make:entity
инструмент и прочитал поле с другим именем - Вуаля! Проблема исправлена.
Вот пример из одного из моих приложений - я сделал это для вашей командирской сущности. Вы сможете собрать свою сущность UserAddress из этого примера самостоятельно!
Вот оно:
User.php
/**
* @ORM\OneToMany(targetEntity="FLY\BookingsBundle\Entity\Commandes", mappedBy="commandesUser")
*/
protected $commandes;
User.php - геттеры и сеттеры
/**
* Add commandes
*
* @param FLY\BookingsBundle\Entity\Commandes $commandes
*/
public function addCommandes(\FLY\BookingsBundle\Entity\Commandes $commandes)
{
$this->commandes[] = $commandes;
}
/**
* Get commandes
*
* @return Doctrine\Common\Collections\Collection
*/
public function getCommandes()
{
return $this->commandes;
}
Commandes.php
/**
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="commandes")
* @ORM\JoinColumn(name="user", referencedColumnName="id")
*/
private $commandesUser;
Commandes.php - Геттеры и сеттеры
/**
* Set commandesUser
*
* @param Application\Sonata\UserBundle\Entity\User $commandesUser
*/
public function setCommandesUser(\Application\Sonata\UserBundle\Entity\User $commandesUser = null)
{
$this->commandesUser = $commandesUser;
}
/**
* Get $commandesUser
*
* @return Application\Sonata\UserBundle\Entity\User
*/
public function getCommandesUser()
{
return $this->commandesUser;
}