查询生成器返回具有oneToMany映射作为数组的对象


Query Builder to return objects with oneToMany mapping as array

我需要更新我的代码,以包括媒体,这是oneToMany单向映射在Object.php实体。理想情况下,我需要我的代码返回所有对象,即使没有媒体,目前它只返回对象与媒体,但它返回多个结果,如果有多个媒体项目。

如果您认为我重构了代码并使用了更简单的东西,那么请告诉我—我没有找到使用getRepo()和findBy()函数(没有序列化?)获取提要的方法

下面是我的代码:

// Build object QB
$emObject         = $this->objectService->getManager();
$qbObject         = $emObject->createQueryBuilder();
$qbObject->addSelect(['o.id', 'o.title', 'o.description', 'm as multimedia', 'c.id as category_id', 'c.name as category_name'])
        ->from('Application'Entity'Cms'Object', 'o')
        ->leftJoin('Application'Entity'Cms'Media', 'm', 'WITH', '1 = 1')
        ->leftJoin('o.media', 'om')
        ->leftJoin('Application'Entity'Cms'Category', 'c', 'WITH', '1 = 1')
        ->leftJoin('o.category', 'oc')
        ->andWhere('om.id = m.id')
        ->andWhere('oc.id = c.id')
        ->andWhere('o.member = :member')
        ->setParameter('member', $member);
$objectList = $qbObject->getQuery()->getResult(Query::HYDRATE_ARRAY);
$viewModel->setVariables(['object' => $objectList]);
return $viewModel;

返回:

{
  "object": [
    {
      "multimedia": {
        "id": 22,
        "title": null,
        "url": "'/srv'/pois'/cms'/e9049aaac93ce96c81e16340027a804b.png"
      },
      "id": 34,
      "title": "imgTest",
      "description": "f",
      "category_id": 1,
      "category_name": "Chambres"
    },
    {
      "multimedia": {
        "id": 23,
        "title": null,
        "url": "'/srv'/pois'/cms'/ce0c7d669c567369485a01c65197943f.png"
      },
      "id": 34,
      "title": "imgTest",
      "description": "f",
      "category_id": 1,
      "category_name": "Chambres"
    }
  ]
}

然而,我需要多媒体对象在一个数组中,只返回一个对象,如:

{
  "object": [
    {
      "multimedia": {
          1: {
            "id": 22,
            "title": null,
            "url": "'/srv'/pois'/cms'/e9049aaac93ce96c81e16340027a804b.png"
          },
          0: {
            "id": 23,
            "title": null,
            "url": "'/srv'/pois'/cms'/ce0c7d669c567369485a01c65197943f.png"
          },
      }
      "id": 34,
      "title": "imgTest",
      "description": "f",
      "category_id": 1,
      "category_name": "Chambres"
    }
  ]
}

我总是使用没有QueryBuilder的DQL查询。我想这就是你想要的:

$query = $this->entityManager->createQuery(
    "SELECT o, m FROM 'Application'Entity'Cms'Object' o JOIN o.multimedia m WHERE o.member = :member"
);
$query->setParameters(array('member' => $member));
$objects = $query->getResult();

我认为没有比这更复杂的了。

在QueryBuilder中,它可能看起来像这样:

$qb = $this->entityManager->createQueryBuilder();
$qb->select('o', 'm')
   ->from('Application'Entity'Cms'Object', 'o')
   ->leftJoin('o.multimedia', 'm')
   ->where('o.member = :member')
   ->setParameter('member', $member);
return $qb->getQuery()->getResult();

如果没有返回您想要的结果,请回来详细说明。我也许能帮你得到你想要的。