如何使用Laravel 4中的detach()仅分离数据透视表中的最后一条记录?

时间:2014-07-17 09:46:01

标签: laravel laravel-4

如果我这样做:

return $this->roles()->detach($role);

删除所有角色。

如何将其限制为仅限最后一个?

3 个答案:

答案 0 :(得分:1)

您可以在没有时间戳的情况下执行此操作:

$lastRole = $user->roles()
    ->orderBy( $user->roles()->getTable() .'id', 'desc')
    ->first();
$user->roles()->detach($lastRole);

或带时间戳:

$lastRole = $user->roles()->latest()->first();
$user->roles()->detach($lastRole);

答案 1 :(得分:0)

你可以试试这个,我没试过它:

return $this->roles()->orderBy('id', 'desc')->first()->detach($role);

如果没有主要ID,您也可以按时间戳排序,如下所示:

return $this->roles()->orderBy('created_at', 'desc')->first()->detach($role);

为了实现这一目标,您还必须从docs

修改模型
  

如果您希望自动维护数据透视表   created_at和updated_at timestamps,使用withTimestamps方法   关系定义:

return $this->belongsToMany('Role')->withTimestamps();

答案 2 :(得分:0)

另一件事就是根本不使用模型,因为看这个issue #3585并不容易。泰勒在没有评论的情况下关闭了它,所以我认为它没有得到实施。解决方案应该是(假设您在表中迁移了时间戳列)。经过测试的代码:

$last = DB::table($user->roles()->getTable())
    ->orderBy('created_at', 'desc')
    ->first();
DB::table($user->roles()->getTable())
    ->where('created_at', '=', $last->created_at)
    ->delete();