为什么我必须在学说关系中使用对象?
Why I must use object in doctrine relation?
为什么我必须在学说关系中使用宾语?
例如,我有两个实体 - 类别和 Post。来自 jquery 我在控制器中收到许多 ID:
$categories = array(3, 5, 2);
如果我想获取对象,那么我必须先获取对象:
$cat = array();
foreach ($categories as $category) {
$cat[] = $this->getDoctrine()
->getRepository('AppBundle:Category')
->find($category);
}
直到现在我才能找到我的 Posts:
$repository = $this->getDoctrine()
->getRepository('AppBundle:Post');
$query = $repository->createQueryBuilder('p');
$query->andWhere('p.category IN (:cat)')
->setParameter('cat', $cat);
$posts = $query->getQuery()->getResult();
为什么我不能在第二个查询中使用简单的 ids 类别?为什么我必须将对象传递给关系查询?为什么查询生成器看不到 category_id 而不是 category?
它对数据库收费并增加了页面加载时间。
它不会看到 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。
您可以通过 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 情况,您应该使用 where()
而不是 andWhere()
。
您可以更改查询构建器以加入类别并使用类别 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();
为什么我必须在学说关系中使用宾语?
例如,我有两个实体 - 类别和 Post。来自 jquery 我在控制器中收到许多 ID:
$categories = array(3, 5, 2);
如果我想获取对象,那么我必须先获取对象:
$cat = array();
foreach ($categories as $category) {
$cat[] = $this->getDoctrine()
->getRepository('AppBundle:Category')
->find($category);
}
直到现在我才能找到我的 Posts:
$repository = $this->getDoctrine()
->getRepository('AppBundle:Post');
$query = $repository->createQueryBuilder('p');
$query->andWhere('p.category IN (:cat)')
->setParameter('cat', $cat);
$posts = $query->getQuery()->getResult();
为什么我不能在第二个查询中使用简单的 ids 类别?为什么我必须将对象传递给关系查询?为什么查询生成器看不到 category_id 而不是 category?
它对数据库收费并增加了页面加载时间。
它不会看到 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。
您可以通过 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 情况,您应该使用 where()
而不是 andWhere()
。
您可以更改查询构建器以加入类别并使用类别 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();