【问题标题】:Why I must use object in doctrine relation?为什么我必须在教义关系中使用对象?
【发布时间】:2015-03-04 20:48:15
【问题描述】:

为什么我必须在教义关系中使用对象?

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

为什么我不能在第二个查询中简单地使用 ids 类别?为什么我必须将对象传递给关系查询?为什么查询生成器看不到 category_id 而不是 category

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

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案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。

    【讨论】:

      【解决方案2】:

      您可以通过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()

      【讨论】:

        【解决方案3】:

        您可以更改查询构建器以加入类别并使用类别 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-09
          • 1970-01-01
          • 1970-01-01
          • 2021-08-16
          相关资源
          最近更新 更多