symfony准则2 OneToMany-与反向场错误相关

时间:2018-12-17 01:52:17

标签: symfony doctrine associations mappedby

我想连接两个实体

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不会   存在。

:(

1 个答案:

答案 0 :(得分:0)

我猜 category_id 是外键。 Don't map foreign keys to fields in an entit因为:

  

在对象模型中,外键毫无意义。外键是关系数据库建立关系的方式。您的对象模型通过对象引用建立关系。因此,将外键映射到对象字段会使关系模型的详细信息大量泄漏到对象模型中,而您实际上不应该这样做。

您的DishCategory实体是拥有方,因为它拥有外键。顺便说一下,更新代码如下:

菜式

String[] stringArray =  responseFirst.split(",")
for(String kvPair: stringArray) {
String[] kv = kvPair.split(":");
String key = kv[0].substring(1).replace('"', '\u0020').trim();
String value = kv[1].substring(1, kv[1].length() - 1).replace('"', '\u0020').trim();

// Now do with key whatever you want with key and value...
if(key.equals("somekey")) {
   // Do something with value if the key is "somekey"...
}
}

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

然后在您的 DishRepository

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();
     }
}

但是我看不出执行double orderBy的意义,因为multiple calls to orderBy do not stack,如果要实现此目的,请使用addOrderBy。而且我猜Query :: HYDRATE_ARRAY也没有必要,因为自定义查询会产生一个数组,而不是实体。