может быть, как-то знает проблему,
Я имею отношение oneToMany, с сохранить / редактировать все окей
/**
* @MongoDB\ReferenceMany(targetDocument="RmaWorkerCities", cascade={"all"}, mappedBy="rmaWorker", storeAs="id", orphanRemoval=true)
*/
protected $cities;
/**
* @MongoDB\ReferenceOne(targetDocument="RmaWorkers", inversedBy="cities")
*/
protected $rmaWorker;
Но когда я хочу найти записи по городам, я получаю эту ошибку:
Cannot use reference \'cities\' in class \'App\\Document\\RmaWorkers\' for lookup or graphLookup: dbRef references are not supported.
Или это просто не работает
Что я пытался сделать:
$builder = $this->dm->createAggregationBuilder('App\Document\RmaWorkers');
if (!empty($filters['cityId'])) {
$builder
->lookup('cities')
->alias('cities');$builder->match()->field('cities.cityId')->equals($filters['cityId']);
}
или просто
$builder
->field('cities.cityId')->equals($filters['cityId'])
;
Как гласит ошибка, ‘Ссылки dbRef не поддерживаютсяна стадии поиска.
Обходным решением для вас может быть извлечение objectId из DBRef, который вы затем можете обычно использовать на этапе поиска.
Написано изначально, это работает так:
db.rmaWorker.aggregate([
{
$project: {
cities_fk: {
$map: {
input: {
$map: {
input:"$cities",
in: {
$arrayElemAt: [{$objectToArray: "$$this"}, 1]
},
}
},
in: "$$this.v"}},
}
},
{
$lookup: {
from:"cities",
localField:"cities_fk",
foreignField:"_id",
as:"B"}
])
Просто адаптируйте приведенный выше пример, чтобы использовать его с AggregationBuilder. Вы также можете создать пользовательскую функцию для инкапсуляции различных шагов, чтобы она не загромождала вашу декларацию агрегатора. Что-то вроде :
$builder = $this->dm->createAggregationBuilder('App\Document\RmaWorkers');
if (!empty($filters['cityId'])) {
$builder
->addFields()
->name('cities_fk')
->mapManyDBRefs()
->lookup('cities_fk')
->alias('cities');$builder->match()->field('cities.cityId')->equals($filters['cityId']);
}
Других решений пока нет …