Laravel със синхронизиране на mongodb belongsToMany

Работя с Laravel 4 и монгодб 2.0.4 модул Имам потребителски и ролеви клас и се опитвам да използвайте релация belongsToMany с методи за прикачване, отделяне и синхронизиране

Потребителски клас

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 вече е решен и обединен в master. вижте github.com/jenssegers/laravel-mongodb/issues/439 - person nabizan; 11.01.2017