Shop
多くがActivities
として定義されているドキュメントがある場合、インスタンスをハイドレートせずにforReferenceMany
のリストを直接クエリできる方法はありますか?Activities
Shop
Shop
例えば:
{
"_id": fd390j09afj09dfj,
"activities": [
...
]
}
私が望むのは、「fd390j09afj09dfjactivities
で_id
ある配列を取得し、それらをインスタンスとして水和できる」と言えることだけです。Activity
これが私が思いついた最初の解決策です:
/**
* Gets all activities configured for a shop.
*
* @param string $shopId
* @return \BikeShed\Domain\Activity[]|\Doctrine\Common\Collections\ArrayCollection
*/
public function findByShopId($shopId) {
/** @var \BikeShed\Domain\Repository\Shop $shopRepository */
$shopRepository = $this->dm->getRepository('BikeShed\Domain\Shop');
$shop = $shopRepository->findOneById($shopId);
return $shop->getActivities();
}
単に を取得してから、定義されたリレーションを介しShop
てすべてを取得します。Activities
jmikola の最後の提案を実装する方法の実例を次に示します。
/**
* @param string $shopId
* @return ActivityModel[]
*/
public function findByShopId($shopId) {
$partialShopData = $this->dm->getRepository('BikeShed\Domain\Shop')->createQueryBuilder()
->hydrate(false)
->field('activities')
->getQuery()
->getSingleResult()
;
$activityIds = [];
if(!empty($partialShopData['activities']))
foreach($partialShopData['activities'] as $activity)
if(!empty($activity['$id']))
$activityIds[] = $activity['$id'];
return $this->createQueryBuilder()
->field('id')
->in($activityIds)
->getQuery()
->toArray()
;
}