我想连接两个实体
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不会 存在。
:(
答案 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也没有必要,因为自定义查询会产生一个数组,而不是实体。