为什么我必须在学说关系中使用对象?
例如,我有两个实体 - 类别和帖子。从jquery我接收到控制器中的许多id:
$categories = array(3, 5, 2);
如果我想获得对象,那么我必须首先得到对象:
$cat = array();
foreach ($categories as $category) {
$cat[] = $this->getDoctrine()
->getRepository('AppBundle:Category')
->find($category);
}
直到现在我才能找到我的帖子:
$repository = $this->getDoctrine()
->getRepository('AppBundle:Post');
$query = $repository->createQueryBuilder('p');
$query->andWhere('p.category IN (:cat)')
->setParameter('cat', $cat);
$posts = $query->getQuery()->getResult();
为什么我不能在第二个查询中使用简单的ID类别?为什么我必须将对象传递给关系查询?为什么查询构建器无法看到 category_id 而不是类别?
它向数据库收费并增加了页面加载时间。
答案 0 :(得分:1)
它不会看到category_id,但它会接受一个简单的ID列表:
$ids = array();
foreach($catIds as $catId)
{
$ids[] = $catId['category_id'];
}
// So $ids look like: array(3, 5, 2)
$qb->setParameter('cat', $ids);
你非常接近。只需插入你的$ categories。
答案 1 :(得分:0)
您可以通过findBy()
方法直接按类别ID找到您的帖子:
$repository = $this->getDoctrine()->getRepository('AppBundle:Post');
$posts = $repository->findBy(['category' => $categories]);
或通过QueryBuilder
:
$repository = $this->getDoctrine()->getRepository('AppBundle:Post');
$query = $repository->createQueryBuilder('p')
->where('p.category IN (:categories)')
->setParameter('categories', $categories);
$posts = $query->getQuery()->getResult();
其中$categories
是您的类别ID的数组。
另外,对于查询中的第一个案例,您应该使用where()
代替andWhere()
。
答案 2 :(得分:0)
您可以更改查询构建器以加入该类别,并使用类别ID,如...
$this
->getDoctrine()
->getRepository('AppBundle:Post')
->createQueryBuilder('p')
// Join to the category object and set the alias to "c"
->join('p.category', 'c')
// where category id is in list of ids
->andWhere('c.id IN (:categoryIds)')
->setParameter('categoryIds', $categoryIds)
->getQuery()
->getResult();