1

我想连接两个实体

某些 DishCategory 中的菜

带有 DishCategory (id) 的菜 (category_id)

有一个错误:

关联 AppBundle\Entity\Dish#categoryId 指的是不存在的反边字段 AppBundle\Entity\DishCategory#category_id。

这些是我的实体类

菜实体

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 实体


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。

:(

4

1 回答 1

0

我猜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;
}

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 也不是必需的,我猜,因为由于自定义查询,您将拥有一个数组,而不是实体。

于 2018-12-17T05:58:20.137 回答