ホームページ >バックエンド開発 >PHPチュートリアル >[ Laravel 5.2 ドキュメント ] Eloquent ORM -- アクセサと修飾子

[ Laravel 5.2 ドキュメント ] Eloquent ORM -- アクセサと修飾子

WBOY
WBOYオリジナル
2016-06-23 13:18:54938ブラウズ

1. はじめに

アクセサーと修飾子を使用すると、モデルのプロパティを取得したり、その値を設定したりするときに Eloquent プロパティをフォーマットできます。たとえば、Laravel 暗号化機能を使用してデータベースに保存されているデータを暗号化し、Eloquent モデルでアクセスしたときに自動的に復号化することができます。

カスタム アクセサーと修飾子に加えて、Eloquent は日付フィールドを Carbon インスタンスに自動的に変換し、テキストを JSON に変換することもできます。

2. アクセサーと修飾子

アクセサーを定義する

アクセサーを定義するには、モデル内に 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 関数を呼び出し、処理された値を内部属性に設定します。 。 価値。

3. Date Modifier

デフォルトでは、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';}

4. 属性変換

モデルの $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();
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。