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?

15
demandé sur cnkt 2010-12-23 00:22:40

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');
7
répondu Andrew Orsich 2011-06-01 07:01:39

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

5
répondu Simone Dagli Orti 2015-10-09 13:29:34
->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i'))
0
répondu Rafael Paulino 2014-09-19 20:50:20