Edited at

Laravelのdelete()メソッドで論理削除しようと思ったらうまくいかなかった話


はじめに

ユーザの論理削除に伴って、メッセージも論理削除しようと思い、下記のコードを実行したところ、メッセージだけ論理削除されずに普通に削除されてしまったので、原因と解決法を書いておきます。

public function deleteUserLogically($id)

{
DB::transaction(function () use ($id) {

$user = User::find($id);

$messages = DB::table('messages')
->Where('from_id', '=', $user->id)
->get();

foreach ($messages as $message)
{
$message->delete();
}

$user->delete();
});
}


原因

Eloquent ORMではなく、DBファサードでdelete()メソッドを実行していた。


解決法

原因がわかったので、delete()メソッドをEloquent ORMで実行していきます。

public function deleteUserLogically($user)

{
DB::transaction(function () use ($id) {

$user = User::find($id);

$messages = Message::Where('from_id', '=', $user->id)
->get();
foreach ($messages as $message)
{
$message->delete();
}

$user->delete();
});
}

これでうまくいきました!


まとめ

今回の出来事で、今までなんとなく使っていた、DBファサードとEloquent ORMについて詳しくなる事ができました!また、Laravelのファサードについての理解も深められたので良かったです。