Laravel は、Web アプリケーションの開発で広く使用されている人気のある PHP 開発フレームワークです。 ORM、ルーティング制御、テンプレートエンジンなどの便利な機能を多数備えており、Webアプリケーション開発を簡単かつ楽しく行えます。その中でも、Laravelのソフトデリート機能は最も人気のある機能の1つです。この記事では、Laravelアップデート後のソフトデリートの変更点とその解決策を紹介します。
Laravel のソフト削除機能
Laravel では、レコードを削除したい場合、delete
メソッドまたは destroy
メソッドを使用できます。ただし、レコードを完全に削除するのではなく、削除済みとしてマークしたい場合は、Laravel の論理的な削除機能を使用する必要があります。
論理的な削除機能を使用するには、SoftDeletes
特性をモデルに追加し、deleted_at
という名前の datetime
タイプをモデルに追加する必要があります。列のデータベース。 delete
または destroy
メソッドを使用してデータベースからレコードが削除されると、レコードは削除済みとしてマークされ、 deleted_at
フィールドは現在のタイムスタンプに設定されます。削除済みとしてマークされたレコードはクエリでは返されませんが、データベースにはまだ存在します。
delete
および destroy
メソッドに加えて、Laravel は、forceDelete
や restore など、他の多くのソフト削除メソッドも提供します。
。 forceDelete
メソッドは論理的に削除されたレコードを完全に削除でき、restore
メソッドは論理的に削除されたレコードをデータベースに復元できます。
Laravel アップデート後のソフトデリートの変更点
Laravel 7 が Laravel 8 にアップデートされた際に、ソフトデリート機能にいくつかの変更が発生しました。 Laravel 8では、論理的な削除動作のデフォルト値が「keep」から「remove」に変更されました。
つまり、Laravel 8 では、delete
または destroy
メソッドを呼び出すと、レコードは以前のバージョンのように削除されるのではなく、完全に削除されます。削除済みとしてマークされています。これにより、削除されたレコードを回復できなくなり、アプリケーションが論理的な削除機能に依存している場合は、予期しないエラーが発生する可能性があります。
回避策
アプリケーションが論理的な削除機能に依存している場合は、論理的な削除機能が期待どおりに動作するように、Laravel 8 で追加の手順を実行する必要があります。
まず、モデル内で論理的な削除の動作を明示的に定義する必要があります。モデルでは、booted
メソッドを定義し、static::deleted
メソッドを呼び出して、モデルのソフト削除動作を次のように定義する必要があります。
use IlluminateDatabaseEloquentSoftDeletes; class MyModel extends Model { use SoftDeletes; protected static function booted() { static::deleted(function ($model) { // Handle soft deletion }); } }
上記ではたとえば、deleted
メソッドを使用して、モデルの論理的な削除動作を定義します。モデルが論理的に削除されると、deleted
メソッドに渡されたクロージャー関数が呼び出されます。
この関数では、論理的な削除時に実行したい任意のコードを記述することができます。たとえば、論理的に削除されたレコードを作成する場合、モデルに追加のプロパティを設定したり、サードパーティ サービスの他のアプリケーションに通知したりできます。
2 番目に、論理的な削除を使用するアプリケーション内のすべての場所が正しく調整されていることを確認する必要があります。たとえば、コード内で deleted_at
フィールドを使用してクエリを実行する場合は、コードがそのフィールドの値を正しく処理していることを確認してください。
最後に、以前に delete
または destroy
メソッドを使用していて、引き続き論理的な削除機能を使用したい場合は、softDelete を使用するようにコードを変更してください。
または softDeletes
メソッドを使用し、以下に示すように SoftDeletes
トレイトを参照します。
class MyController extends Controller { public function delete($id) { $record = MyModel::find($id); $record->softDelete(); // 使用 softDelete 方法 // ... } }
上記の例では、softDelete
Method を使用して、レコードをソフト削除します。複数のレコードを削除する場合は、softDeletes
メソッドを使用します。
結論
Laravelではソフトデリートは非常に便利な機能ですが、Laravel 8では動作が変更されました。論理的な削除機能が期待どおりに動作することを確認するには、モデルで論理的な削除の動作を明示的に定義し、論理的な削除が使用されるアプリケーションで適切な調整を行う必要があります。
Laravel バージョンを更新する前に、十分な準備ができていることを確認し、更新後も論理的な削除機能が期待どおりに動作するかどうかを確認してください。
以上がlaravelは更新後にソフト削除されましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。