2017-12-08 12 views
3

私はlaravel 5.4を使用しています。モデルのソフト削除テーブルの列を上書きする

私は、次の属性を持つデータベーステーブルを指すモデルを持っています。

id  integer 
name  varchar 
location varchar 
deleted boolean 

これは古いテーブルであり、コードの束に束縛されているため、このテーブルを変更することはできません。

私がしたいことは、モデル内のlaravelsソフト削除機能を利用することです。私はlaravelが列名がdeleted_atで、データ型がdateであるとデータベーステーブルに期待していることが分かります。

Laravelが列deletedを見て、それがbooleanであることを確認するために、これを上書きするにはどうすればよいですか?

私のモデルが継承しているクラスを見てみましたが、これを処理する定数と関数がどこに定義されているのか見当たりませんでした。私はそれがコレクションにあるかもしれないと思うが運がなかった。

理想的には、モデル内の関数を単に再定義したいと考えています。

ありがとうございました。

答えて

3

Illuminate\Database\Eloquent\SoftDeletes形質を調べて、runSoftDelete()およびgetDeletedAtColumnメソッドをモデルにオーバーライドします。

runSoftDelete()用いる代わりに、タイムスタンプのboolean INとgetDeletedAtColumn()使用DELETED代わりにDELETED_AT

に別の解決策は、ソフト削除されたデータで動作するようにglobal scopes又はlocal scopesを添加します。

+0

'Illuminate \ Database \ Eloquent \ SoftDeletingScope'クラスは、ゴミ箱でないカラムに基づいてクエリを実行します。ブール値 'false'は、ヌルではないので、ゴミ箱とみなされます。それにも対応する必要があります。 –

+1

@JohnEllmoreそれは本当にありがとう、ありがとう。私はそれを行う最も簡単な方法は 'deleted'をnullにすることです。この場合、OPは 'boolean'を働かせるために3つ以上のメソッドをオーバーライドする必要はありません。あなたが 'nullable'にすることができず、非常に多くのメソッドをオーバーライドしたくない場合は、@ hdifen独自の特性を作成することを検討してください。私はあなたがLaravelが提供するソフト削除関連の機能をすべて必要としないと確信していますので、その特性は簡単に簡単にできます。 –

+0

ねえ、そういうわけで、私が思うのは、削除された列しかないモデルが必要なときです。これは、クエリに 'WHERE NULL'ステートメントを追加します。私はそれを使ってモデルを削除できるようにいくつかの関数を上書きすることができますが、アイテムを取得するときには、削除されたアイテムを返すという問題が発生します。 @ JohnEllmore私はあなたのソリューションを行うための出発点は何ですか?モデルを作成する方法がわからないのは、「削除済み= 0」の項目を取得することです。 – hdifen

関連する問題