質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

4回答

5104閲覧

【Laravel】ソフトデリートカラムのカスタマイズ

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

2クリップ

投稿2018/02/25 02:37

テーブルにdeleted_atカラムを追加するソフトデリート機能を有効にできると思いますが、
このカラム名を**delete_flag(1=削除)**のように独自のカラムに変更することは可能でしょうか?

既にdelete_flagが使用されているのでカラム名をdeleted_at置き換えるというのは難しい状況です。

調べても公式ドキュメントにも記載されていませんし、そのような記事も見つけられなかったので質問させてください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

下記の様にtraitをオーバーライドしてみては如何でしょうか?
ざっと検証した限りでは、問題なく稼働している様に思いますが…

Model

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Database\Eloquent\SoftDeletes; 7 8 9class testTable extends Model 10{ 11 use SoftDeletes; 12 protected $table = 'testTable'; 13 public $timestamps = false; 14 15 /** 16 * ソフトデリートの判定カラムを上書き 17 * @return string 18 */ 19 public function getDeletedAtColumn(): string 20 { 21 return 'delete_flg'; 22 } 23 /** 24 * 25 * @return void 26 */ 27 public function runSoftDelete() 28 { 29 $query = $this->newQueryWithoutScopes()->where($this->getKeyName(), $this->getKey()); 30 31 $time = $this->freshTimestamp(); 32 33 //$columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)]; 34 $columns = [$this->getDeletedAtColumn() => true]; 35 36 //$this->{$this->getDeletedAtColumn()} = $time; 37 $this->{$this->getDeletedAtColumn()} = true; 38 39 if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) { 40 $this->{$this->getUpdatedAtColumn()} = $time; 41 42 $columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time); 43 } 44 45 $query->update($columns); 46 } 47} 48

migrate

php

1<?php 2 3use Illuminate\Support\Facades\Schema; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Database\Migrations\Migration; 6 7class TestTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('testTable', function (Blueprint $table) { 17 $table->increments('id'); 18 $table->string('name'); 19 $table->boolean('delete_flg')->nullable(); 20 }); 21 } 22 23 /** 24 * Reverse the migrations. 25 * 26 * @return void 27 */ 28 public function down() 29 { 30 Schema::dropIfExists('testTable'); 31 } 32}

投稿2018/02/26 07:09

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SoftDeletesトレートのソースです。
https://github.com/laravel/framework/blob/5.5/src/Illuminate/Database/Eloquent/SoftDeletes.php

論理削除に使うカラム名は内部的にgetDeletedAtColumnメソッドで取得していますが

PHP

1public function getDeletedAtColumn() 2{ 3 return defined('static::DELETED_AT') ? static::DELETED_AT : 'deleted_at'; 4}

論理削除を使うモデルに、DELETED_ATというオブジェクト定数が定義されていればそれを使い、
定義されていなければdeleted_atを使うという実装になっています。
なので、論理削除を使うモデルに定数追加でいけそうです(すいませんが手元で試せてはいません)

PHP

1const DELETED_AT = 'delete_flag';

投稿2018/02/25 03:30

編集2018/02/25 04:04
Archsted

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Archsted

2018/02/25 03:33

あ、申し訳ないです。delete_flagは日付じゃなくて0/1の数値型なんですね。 ちょっと確認します。
退会済みユーザー

退会済みユーザー

2018/02/25 03:38

マジックメソッド __set でどうにかなんじゃね
Archsted

2018/02/25 03:57

確かに値の変換は__setでいけそうですね。ただSoftDeletes内部でグローバルスコープに登録してるSoftDeletingScopeで、削除判定にwhereNullをクエリビルダに追加しているので、0/1管理になってたら無理っぽいです。このスコープを模して作ったスコープをSoftDeletesトレートのbootSoftDeletes()をオーバーライドして設定すればできるでしょうけど・・・ ということですいません、私の上の回答は今回のケースでは取り下げとさせてください。
退会済みユーザー

退会済みユーザー

2018/02/25 04:11

そこは __get でもどうにかして 0 の場合 null とか
guest

0

以前似たようなことに遭遇したときの解法です。
ご参考までにどうぞ。
https://qiita.com/sh-ogawa/items/8c1e9beee7c19be99862

投稿2018/03/09 03:28

sh-ogawa

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

回答者の方々からのご意見をいただき、私のスキルでは、結構時間がかかりそうかつ、プロダクションでの動作を保証できかねると判断したため、当該機能を見送ることとしました。
ご回答くださった方、本当にありがとうございました。みなさんの考え方について今後の何かの参考にさせていただきます。

投稿2018/03/20 16:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問