Laravel Eloquent ORM delete() 方法

81

嗨,我正在学习Laravel。 我使用Eloquent ORM中的删除方法,但结果不是true或false,而是null。 我设置了一个资源路由,在UsersController中有一个destroy方法。

public function destroy($id){

  $res=User::find($id)->delete();
  if ($res){
    $data=[
    'status'=>'1',
    'msg'=>'success'
  ];
  }else{
    $data=[
    'status'=>'0',
    'msg'=>'fail'
  ];
  return response()->json($data);

但是我总是得到一个响应 {"status":"0","msg":"failed"},数据库中的记录已被删除。

然后我使用dd($res)。它在页面上显示null。

但从课程中我学到它返回一个布尔值true或false。

我的代码有错误吗?

你能告诉我一些删除数据库中数据时可以获得布尔结果的其他方法吗?

7个回答

139

我认为你可以更改查询并尝试以下方式:

$res=User::where('id',$id)->delete();

$res变量中会是什么?它会返回布尔值 - true表示已删除,false表示未删除,还是删除记录的ID?请确认。谢谢。 - Kamlesh
如果我有模型本身呢?比如$file对象? - mercury
幕后$res=User::where('id',$id)->delete();会是2个查询还是1个? - Guntar
同时阅读:https://devnote.in/how-to-delete-record-by-id-using-laravel-eloquent/ - Fefar Ravi

49

在laravel中,delete之前有几种方法。

User::find(1)User::first()返回一个实例。

User::where('id',1)->getUser::all()返回实例的集合。

在模型实例上调用delete会返回true/false

$user=User::find(1);
$user->delete(); //returns true/false

对实例集合调用delete会返回一个数字,该数字代表删除的记录数。

//assume you have 10 users, id from 1 to 10;
$result=User::where('id','<',11)->delete(); //returns 11 (the number of the records deleted)

//lets call delete again
$result2=User::where('id','<',11)->delete(); //returns 0 (we have already delete the id<11 users, so this time we delete nothing, the result should be the number of the records deleted(0)  ) 

还有其他删除方法,您可以像下面这样调用destroy作为模型的静态方法

$result=User::destroy(1,2,3);
$result=User::destroy([1,2,3]);
$result=User::destroy(collect([1, 2, 3]));
//these 3 statement do the same thing, delete id =1,2,3 users, returns the number of the records deleted

如果您是Laravel新手,还有一件事情:您可以使用php artisan tinker来查看结果,这更有效率,然后再使用dd($result)print_r($result);


19

首先,你应该知道 destroy() 是通过对象或模型直接删除实体的正确方法,而 delete() 仅可在查询构建器中调用。

在你的情况下,你没有检查记录是否存在于数据库中。只有存在记录才能被删除。

因此,你可以按照以下方式操作。

$user = User::find($id);
    if($user){
        $destroy = User::destroy(2);
    }

无论成功或失败,$destroy的值将分别为0或1。因此,您可以像这样修改$data数组:

if ($destroy){

    $data=[
        'status'=>'1',
        'msg'=>'success'
    ];

}else{

    $data=[
        'status'=>'0',
        'msg'=>'fail'
    ];

}

希望你能理解。


感谢您的留言。我使用查询构建器(where)并且它有效。然后,我尝试使用 User::destroy($id) ,结果返回0。但是表中的记录消失了。我在id上有一个外键,这是导致删除有效但返回0结果的原因吗? - Evol Rof

4

Laravel Eloquent 提供destroy()函数,它返回一个boolean值。如果数据库中存在并已被删除的记录,则会返回true,否则返回false

下面是使用Laravel Tinker shell的示例:

delete operation result

在这种情况下,你的代码应该像这样:

public function destroy($id)
    {
        $res = User::destroy($id);
        if ($res) {
            return response()->json([
                'status' => 1,
                'msg' => 'success'
            ]);
        } else {
            return response()->json([
                'status' => 0,
                'msg' => 'fail'
            ]);
        }
    }

了解有关Laravel Eloquent删除模型的更多信息。


4
$model=User::where('id',$id)->delete();

2
您可以使用两种方法删除数据。 第一种方法是使用find。 第二种方法是使用带有模型的where。 您可以尝试以下内容。 第一步:
User::find($id)->destroy();

或者第二种方法
User::where('id', $id)->delete();

现在请尝试运行它,它将返回True/False结果。

2

在删除用户之前进行检查,否则会抛出错误异常。

$user=User::find($request->id);
  
   if($user)
   {
   // return $user;           <------------------------user exist
       if($user->delete()){
         return 'user deleted';
         }
    else{
       return "something wrong";
        }   

   }
  else{
     return "user not exist";// <--------------------user not exist
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接