Доктрина и 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 папка).

Так что я просто:

  1. Удален один из проблемных объектов (и его сеттер / получатель)
  2. Прогнал php bin/console make:entity инструмент и прочитал поле с другим именем
  3. Вуаля! Проблема исправлена.

Вот пример из одного из моих приложений - я сделал это для вашей командирской сущности. Вы сможете собрать свою сущность 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;
}
Другие вопросы по тегам