доктрина Symfony 2 OneToMany - ассоциация с ошибкой обратной стороны поля - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу соединить две сущности

Блюдо, которое находится в некоторой категории DishCategory

Блюдо (category_id) с DishCategory (id)

Возникла ошибка:

Ассоциация AppBundle \ Entity \ Dish # categoryId ссылается на обратное боковое поле AppBundle \ Entity \ DishCategory # category_id, которое не существует.

Это мои классы сущностей

Dish Entity

class Dish
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

    /**
     *@ORM\ManyToOne(targetEntity = "DishCategory",inversedBy="category_id",cascade={"persist"})
     * @ORM\JoinColumn(name="id",referencedColumnName="id")
     */
     private $categoryId;
}

DishCategory Entity


class DishCategory
{

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\OneToMany(targetEntity="Dish", mappedBy="category_id")
     * @ORM\JoinColumn(name="category_id",referencedColumnName="id")
     */
     private $id;
}

В DishController я запускаю эту функцию для репозитория


$dishes = $em->getRepository('AppBundle:Dish')->findAllAsArray();

А вот так выглядит DishRepository

public function findAllAsArray()
{
    return $q = $this->createQueryBuilder('d')
        ->join('d.categoryId','c')
        ->select('d.id as id_dish','c.id as id_cat','d.price')
        ->orderBy('c.position', 'asc')
        ->orderBy('d.position', 'asc')
        ->getQuery()
        ->getResult(Query::HYDRATE_ARRAY);
    }

Я прочитал много учебников об OneToMany, но все еще не могу найти, в чем проблема :(

Все еще получаю ошибку:

Ассоциация AppBundle \ Entity \ Dish # categoryId относитсяв обратное боковое поле AppBundle \ Entity \ DishCategory # category_id, которое не существует.

: (

1 Ответ

0 голосов
/ 17 декабря 2018

Я думаю, category_id - это внешний ключ. Не отображать внешние ключи в поля в праве , потому что:

Внешние ключи не имеют никакого значения в объектной модели.Внешние ключи - это то, как реляционная база данных устанавливает отношения.Ваша объектная модель устанавливает отношения через ссылки на объекты.Таким образом, сопоставление внешних ключей с полями объекта сильно утечет детали реляционной модели в объектную модель, чего вы действительно не должны делать.

ваша сущность DishCategory - это Сторона владения , потому что онадержит внешний ключ.Кстати, обновите ваш код, как показано ниже:

Блюдо-сущность

class Dish
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;


    /**
     * @ORM\ManyToOne(targetEntity="DishCategory", inversedBy="dishes")
     * @ORM\JoinColumn(name="dish_category_id",referencedColumnName="id")
     */
     private $dishCategory;
}

Блюдо-категория сущности

class DishCategory
{

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

     /**
      * @ORM\OneToMany(targetEntity="Dish", mappedBy="dishCategory")
      */
      private $dishes;

     public function __construct()
     {
         $this->dishes = new ArrayCollection();
     }
}

Тогдав вашем DishRepository

public function findAllAsArray()
{
    return $q = $this->createQueryBuilder('d')
        ->join('d.category','c')
        ->select('d.id as id_dish','c.id as id_cat','d.price')
        ->addOrderBy('c.position', 'asc')
        ->addOrderBy('d.position', 'asc')
        ->getQuery()
        ->getResult(Query::HYDRATE_ARRAY)
    ;
}

Но я не вижу смысла делать двойной orderBy, потому что несколько вызовов orderBy не складываются , используйте addOrderBy, если выхочу добиться этого.А также Query :: HYDRATE_ARRAY, я думаю, не нужен, потому что у вас будет массив из-за пользовательского запроса, а не сущности.

...