Laravel с синхронизацией mongodb

Я работаю с Laravel 4 и модулем mongodb 2.0.4. У меня есть класс User и Role, и я пытаюсь использовать отношение ownToMany с методами присоединения, отсоединения и синхронизации

Класс пользователя

public function roles()
{
    return $this->belongsToMany('Role', null, 'user_ids', 'role_ids');
}

Класс роли

public function users()
{
    return $this->belongsToMany('User', null, 'role_ids', 'user_ids'
}

Когда я запускаю метод присоединения

$user = User::find($id);
$user->roles()->attach(array($role_id));

mongodb генерирует один из запросов неправильно (или нет?)

user.update({"_id":{"$id":"54f8d7802228d5e42b000036"}},{"$addToSet":{"role_ds":{"$each":["54f8d7b02228d5e42b000037"]}}},{"multiple":true})

role.update({"_id":["54f8d7b02228d5e42b000037"]},{"$addToSet":{"user_ids":{"$each":["54f8d7802228d5e42b000036"]}}},{"multiple":true})

коллекция пользователей обновляется, но коллекция ролей остается нетронутой. Он должен генерировать такой запрос?

role.update({"_id":{"$id":"54f8d7b02228d5e42b000037"}},{"$addToSet":{"user_ids":{"$each":["54f8d7802228d5e42b000036"]}}},{"multiple":true})

Эта проблема присутствует как с методами присоединения, так и с методами отсоединения. Только синхронизация работает корректно. Но только если есть один элемент. Если вы запускаете синхронизацию для нескольких элементов, одна из коллекций всегда остается неповрежденной из-за неправильного запроса.

Я что-то упустил или действительно есть проблема с этим отношением? Любая помощь будет здорово. Спасибо


person nabizan    schedule 06.03.2015    source источник
comment
Выглядит глючно. Не могли бы вы представить сравнительный пример, где одна реляционная сторона belongsToMany(), а другая сторона hasMany(). Отсутствие набора текста ObjectId настораживает. Как и обработка преобразования списка. Я был бы заинтригован, чтобы увидеть, дает ли мой упомянутый тестовый пример аналогичный или другой результат.   -  person Neil Lunn    schedule 10.03.2015
comment
У меня похожая структура. При использовании $user-›roles я получаю массив идентификаторов. Вместо этого я хотел бы иметь объекты. У меня неправильная конфигурация или это нормальное поведение?   -  person Sven Mäurer    schedule 18.11.2016


Ответы (1)


Заменять

$user->roles()->attach(array($role_id));

С

$user->roles()->attach($role_id);

Если ваш параметр не является массивом, вы должны использовать метод attach. Метод sync принимает только массив в качестве параметра. Вот хорошее объяснение о них. Надеюсь, это будет полезно для вас.

person Arkar Aung    schedule 16.03.2015
comment
это не правильно. Я создал пару модульных тестов, чтобы доказать это github.com/jenssegers/laravel-mongodb/commit / проблема в самой библиотеке. в моем вопросе указан только один присоединяемый role_id, но это не точка, это просто пример неправильного поведения - person nabizan; 18.03.2015
comment
Что не так ?? Проверьте это github.com/ jenssegers/laravel-mongodb/blob/master/src/. Я просто указал на основе вашего кода. - person Arkar Aung; 18.03.2015
comment
@nabizan вы нашли решение проблемы с sync ()? - person Inzmam ul Hassan; 10.01.2017
comment
@InzmamGujjar уже решен и объединен с мастером. см. github.com/jenssegers/laravel-mongodb/issues/439 - person nabizan; 11.01.2017