アクセサーと修飾子を使用すると、モデルのプロパティを取得したり、その値を設定したりするときに Eloquent プロパティをフォーマットできます。たとえば、Laravel 暗号化機能を使用してデータベースに保存されているデータを暗号化し、Eloquent モデルでアクセスしたときに自動的に復号化することができます。
カスタム アクセサーと修飾子に加えて、Eloquent は日付フィールドを Carbon インスタンスに自動的に変換し、テキストを JSON に変換することもできます。
アクセサーを定義する
アクセサーを定義するには、モデル内に getFooAttribute メソッドを作成する必要があります。ここで、Foo はアクセスするフィールド名です (キャメル ケースの命名規則を使用します)。この例では、 first_name プロパティのアクセサーを定義します。これは、 first_name の値を取得するときに Eloquent によって自動的に呼び出されます:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 获取用户的名字 * * @param string $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); }}
ご覧のとおり、フィールドのネイティブ値が accessor に渡され、返されます。処理された値。値にアクセスするには、 first_name にアクセスするだけです:
$user = App\User::find(1);$firstName = $user->first_name;
修飾子を定義します
修飾子を定義するには、モデル内で setFooAttribute メソッドを定義する必要があります。ここで、Foo はアクセスするフィールドです (キャメルケースの命名規則を使用します)。次に、モデルの first_name に値を割り当てるときに自動的に呼び出される first_name 属性の修飾子を定義しましょう:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 设置用户的名字 * * @param string $value * @return string */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); }}
この修飾子は、設定する属性値を取得し、値を操作して内部プロパティ値を設定できるようにします。 Eloquentモデルの数値は操作後の値です。たとえば、Sally の first_name 属性を設定しようとすると、次のようになります:
$user = App\User::find(1);$user->first_name = 'Sally';
この場合、setFirstNameAttribute メソッドが呼び出され、パラメーター Sally が渡され、修飾子はそれに対して strto lower 関数を呼び出し、処理された値を内部属性に設定します。 。 価値。
デフォルトでは、Eloquent は created_at 列と updated_at 列の値を Carbon インスタンスに変換し、PHP のネイティブ Datetime クラスを継承し、さまざまな便利なメソッドを提供します。
どのフィールドが自動的に調整および変更されるかをカスタマイズでき、モデルの $dates 属性をオーバーライドすることで調整を完全に無効にすることもできます:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 应该被调整为日期的属性 * * @var array */ protected $dates = ['created_at', 'updated_at', 'disabled_at'];}
フィールドが日付形式の場合は、その値を UNIX タイムスタンプに設定できます。日付文字列 (Y-m-d)、日付時刻文字列、Datetime/Carbon インスタンス、日付値は、正しい形式でデータベースに自動的に保存されます:
$user = App\User::find(1);$user->disabled_at = Carbon::now();$user->save();
前述したように、$dates にリストされている値を取得するとき、配列プロパティの場合、それらは自動的に Carbon インスタンスに変換され、プロパティで任意の Carbon メソッドを使用できるようになります:
$user = App\User::find(1);return $user->disabled_at->getTimestamp();
タイムスタンプをカスタマイズする必要がある場合、デフォルトでは、タイムスタンプ形式は「Y-m-d H:i:s」です。形式を指定するには、モデルに $dateFormat 属性を設定します。これにより、日付属性がデータベースに保存され、配列または JSON にシリアル化されるときの形式が決まります。
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Flight extends Model{ /** * 模型日期的存储格式 * * @var string */ protected $dateFormat = 'U';}
モデルの $casts 属性は属性フィールドです。一般的なデータ型に変換するための便利なメソッドが提供されています。 $casts プロパティは配列形式で、キーはキャストするプロパティの名前、値はキャストする型です。現在サポートされている変換タイプには、整数、実数、浮動小数点数、倍精度浮動小数点数、文字列、ブール値、オブジェクト、配列、コレクション、日付、日時が含まれます。
たとえば、is_admin 属性を整数型 (0 または 1) からブール型に変換してみましょう:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 应该被转化为原生类型的属性 * * @var array */ protected $casts = [ 'is_admin' => 'boolean', ];}
これで、基になる値がデータベースに格納されている場合でも、is_admin 属性はアクセス時に常にブール型に変換されます。は整数です:
$user = App\User::find(1);if ($user->is_admin) { //}
配列変換
配列型変換は、シリアル化された JSON 形式で保存されたフィールドを操作する場合に特に便利です。たとえば、データベースにシリアル化された JSON を含む TEXT フィールド型がある場合、配列型を追加します。そのプロパティへの変換は、Eloquent モデルで値にアクセスするときに自動的に PHP 配列に逆シリアル化されます:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 应该被转化为原生类型的属性 * * @var array */ protected $casts = [ 'options' => 'array', ];}
型変換が定義された後、オプション プロパティにアクセスすると、オプションを設定すると JSON から PHP 配列に自動的に逆シリアル化されます。属性を指定すると、指定された配列はストレージ用に自動的に JSON に変換されます:
$user = App\User::find(1);$options = $user->options;$options['key'] = 'value';$user->options = $options;$user->save();