Comment trouver par document référencé dans la Doctrine ODM avec MongoDB?
j'ai un document dans mon "params" collection comme ceci:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"$ref": "productTypes",
"$id": ObjectId("4d120a2d2b8d8d3010000000"),
"$db": "test"
}
]
}
le document référencé est ceci:
{
"_id": ObjectId("4d120a2d2b8d8d3010000000"),
"code": "car"
}
J'utilise DoctrineODM pour récupérer les documents" param "qui référencent" productType "est"car". Je suis en utilisant ce code:
$query = $dm->createQuery('CmsModelParam');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);
mais le résultat est un tableau vide. Comment puis-je faire cela?
3 réponses
si vous utilisez ReferenceMany ou ReferenceOne, vous ne pouvez pas interroger par n'importe quel champ de document de référence, sauf l'id du document de référence.
Si vous avez besoin d'une requête sur code
référencé de collection, vous devez utiliser EmbedMany
au lieu de ReferenceMany
.
Dans ce cas, votre document sera:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"_id": ObjectId("4d120a2d2b8d8d3010000000"),
"code": "car"
}
]
}
Et la requête suivante:
$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);
si votre code de type de produit est unique, vous pouvez l'utiliser à la place de MongoId
, dans ce cas, vous pouvez interroger sur $id:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"$ref": "productTypes",
"$id": 'car',
"$db": "test"
}
]
}
document de référence:
{
"_id": 'car'
}
Requête:
$query->field('productTypes.$id')->equals('car');
Vous devez utiliser le références() méthode de Générateur de Requêtes pour un @MongoDB\ReferenceOne comme https://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html
$productType = $dm->getRepository('Cms\Model\ProductTypes')->findOneByCode('car');
$queryBuilder = $dm->getRepository('Cms\Model\Param')->createQueryBuilder()
->field('productTypes')->references($productType);
$results = $queryBuilder->getQuery()->execute();
PS: utiliser includesReferenceTo () @MongoDB\ReferenceMany
->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i'))