如何在筛选后的查询结果中使用Laravel的attach()?

时间:2017-02-16 10:12:13

标签: php laravel laravel-5.2

我想在过滤后的Builder结果中使用attach()

$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()

2 个答案:

答案 0 :(得分: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);

我认为"方法角色()不存在"发生异常是因为您正在过滤 Eloquent Collection

编辑:我明白为什么这不起作用。这是因为您尝试将整个集合附加到角色。如果您使用find()然后附加了一个角色,它将起作用。

因此,您应该遍历所有类型为1的用户并附加角色

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

答案 1 :(得分: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'));