2017-02-16 2 views
0

Я хотел бы использовать attach() на отфильтрованный результат Builder:Как использовать прикрепленный файл Laravel() для отфильтрованного запроса?

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    return $item->type == 1; 
}); 

$usersType_2 = $users->filter(function($item) { 
    return $item->type == 2; 
}); 

$usersType_1->role()->attach(3); 
$usersType_2->role()->attach(4); 

Таким образом, мне нужно прикрепить role на основе пользователя type. Метод role() указан на User модели

attach() часть из кода выше выдает следующее сообщение об ошибке: Метод ролей() не существует - который я предполагаю, происходит потому, что filter() возвращает коллекцию.

Есть ли способ подключения записей поворота в отфильтрованном результате Builder? Или мне нужно запустить 2 отдельных запроса и запустить attach() на них соответственно?

+0

роли() функция не существует вы извлекая эту модель в контроллер – Sona

+0

Все происходит в другой модели. Метод 'role()' указан в модели 'User'. – lesssugar

+0

Функция роли присутствует в пользовательской модели. – Sona

ответ

0

Почему бы не просто сделать:

$usersType_1 = $users->where('type', 1); // or whereType(1) 
$usersType_1->role()->attach(3); 

$usersType_2 = $users->where('type', 2); // or whereType(1) 
$usersType_2->role()->attach(4); 

Я думаю, что «Метод роль() не существует» исключение происходит потому, что вы фильтрацию в Красноречивой Коллекции.

EDIT: Я понимаю, почему это не работает. Это потому, что вы пытаетесь привязать целую коллекцию к роли. Он будет работать, если вы использовали find(), а затем приложили роль.

Таким образом, вы должны перебираем всех пользователей с 1-го типа и присоедините роль

foreach ($usersType_1 as $user) { 
    $user->role()->attach(3); 
} 
+0

Аналогичная ошибка, к сожалению. – lesssugar

0

Вы не можете использовать role метод не сбора вместо User модели. Попробуйте по:

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    if($item->type == 1) { 

     return $item->role()->attach(3); 
    } 
}) 
->all(); 

$usersType_2 = $users->filter(function($item) { 
    if($item->type == 2) { 

     return $item->role()->attach(4); 
    } 
}) 
->all(); 

Альтернатива:

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    $item->type == 1; 
}) 
->all(); 

$usersType_2 = $users->filter(function($item) { 
    return $item->type == 2; 
}) 
->all(); 

$role1 = Role::find(3); 
$role2 = Role::find(4); 

$role1->users()->attach($usersType_1->puck('id')); 

$role2->users()->attach($usersType_2->puck('id')); 
+0

Не будет ли это в основном действовать как цикл, в котором 'attach()' будет использоваться 'N' раз? Если да, это будет не очень эффективно, если у меня будет много пользователей обоих типов. – lesssugar

+1

Альтернативы назначают 'users'' role'. Сначала найдите 'Role' attach' users'. – mrabbani

+0

Это хорошая идея. Благодаря! – lesssugar

Смежные вопросы