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

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