前提・実現したいこと
Laravelの論理削除で、他のカラムの値も更新したい。
そのためには
trait Illuminate\Database\Eloquent\SoftDeletes
の
メソッドrunSoftDelete()
をオーバーライドするという記事があったのでそれを参考にしましたが
どこに何を書いても何も変わりません。
基本的なLaravelフレームワークの理解ができていないと思うのですが
アドバイスいただければと思います。
該当のソースコード
####アプリケーションのModel
php
1namespace App\Models; 2 3use Illuminate\Database\Eloquent\Model; 4use Illuminate\Database\Eloquent\SoftDeletes; 5use App\Models\CommonTrait; 6 7class Test extends Model 8{ 9 use SoftDeletes,CommonTrait { 10 CommonTrait::runSoftDelete insteadof SoftDeletes; 11 } 12~略~ 13} 14
####オーバーライドメソッドを含むtrait
php
1namespace App\Models; 2 3trait CommonTrait 4{ 5 /** 6 * Perform the actual delete query on this model instance. 7 * 8 * @return void 9 */ 10 protected function runSoftDelete() 11 { 12 $query = $this->newModelQuery()->where($this->getKeyName(), $this->getKey()); 13 14 $time = $this->freshTimestamp(); 15 16 $columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)]; 17 18 $this->{$this->getDeletedAtColumn()} = $time; 19 20 if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) { 21 $this->{$this->getUpdatedAtColumn()} = $time; 22 23 $columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time); 24 } 25 //ここから追加*************************** 26 $columns['deleted_by'] = \Auth::user()->id; 27 28 \Log::debug('論理削除', [\Auth::user()->id]); 29 //ここまで追加*************************** 30 31 $query->update($columns); 32 } 33} 34
試したこと
- フレームワークのコード自体を書き換え
vendor\laravel\framework\src\Illuminate\Database\Eloquent\SoftDeletes.php
を直接書き換えてみる。
→変化なし。(オリジナルの処理がされる)
- フレームワークのコード自体にシンタックスエラーを埋め込み
vendor\laravel\framework\src\Illuminate\Database\Eloquent\SoftDeletes.phpや
vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.phpに
シンタックスエラーになるコードを埋め込み。
→エラーになる。
- フレームワークのコード自体にランタイムエラーを埋め込み
vendor\laravel\framework\src\Illuminate\Database\Eloquent\SoftDeletes.phpや
vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.phpに
ランタイムエラーになるコードを埋め込み。
→変化なし。(エラーにならず正常に処理される)
- insteadofを使わずtraitをuse
上記アプリケーションのModelでinsteadofを使わずuse。
→エラーになる。
Trait method runSoftDelete has not been applied, because there are collisions with other trait methods
- アプリのModelに直接メソッドを記述
上記コードのクラスTest内に、メソッドrunSoftDeleteを記述。
SoftDeletesをuseする際
SoftDeletes::runSoftDeletea runSoftDeleteOriginal
と記述。
→変化なし。(オリジナルの処理がされる)
補足情報(FW/ツールのバージョンなど)
- phpバージョン
PHP 7.3.5
- Laravelバージョン
Laravel Framework 5.5.48