Как найти по ссылочному документу в Doctrine ODM с MongoDB?
У меня есть один документ в моей коллекции "params":
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"$ref": "productTypes",
"$id": ObjectId("4d120a2d2b8d8d3010000000"),
"$db": "test"
}
]
}
ссылочный документ таков:
{
"_id": ObjectId("4d120a2d2b8d8d3010000000"),
"code": "car"
}
Я использую DoctrineODM для извлечения "param" документов, на которые ссылается "productType", является "автомобилем". Я использую этот код:
$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);
но результатом является пустой массив. Как я могу это сделать?
Ответы
Ответ 1
Если вы используете ReferenceMany или ReferenceOne, вы не можете запрашивать какое-либо поле ссылочного документа, кроме идентификатора ссылочного документа.
Если вам нужен запрос в code
из ссылочной коллекции, вы должны использовать EmbedMany
вместо ReferenceMany
.
В этом случае ваш документ будет выглядеть следующим образом:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"_id": ObjectId("4d120a2d2b8d8d3010000000"),
"code": "car"
}
]
}
И следующий запрос будет работать:
$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);
Также, если ваш код ProductType уникален, вы можете использовать его вместо MongoId
, в этом случае вы можете запросить на $id:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"$ref": "productTypes",
"$id": 'car',
"$db": "test"
}
]
}
Ссылка:
{
"_id": 'car'
}
Query:
$query->field('productTypes.$id')->equals('car');
Ответ 2
Вы должны использовать метод reference() Query Builder для @MongoDB\ReferenceOne, например 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: используйте includeReferenceTo() a @MongoDB\ReferenceMany
Ответ 3
->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i'))