为什么我必须在学说关系中使用对象?

时间:2015-03-04 20:48:16

标签: php symfony doctrine-orm

为什么我必须在学说关系中使用对象?

例如,我有两个实体 - 类别和帖子。从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 而不是类别

它向数据库收费并增加了页面加载时间。

3 个答案:

答案 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();