7つの必ず知っているLaravel Modelの小さな知識

3877 ワード

記事は専門のLaravel開発者コミュニティに転送され、元のリンク:https://learnku.com/laravel/t...
私が初めてLaravelで開発を始めたとき、モデルを実現する際にもっと良い方法で完成できることがたくさんあると感じました.Eloquentモデルクラスを探索した後、私はあなたがあなたのモデルで面白いことをすることができることを発見しました.これはあなたをもっと楽にすることができます.
この文章では、Laravelを使用するすべての人にあなたのモデルをどのように十分に利用すべきかを知ってもらう7つのヒントを提供します.
1まず、モデルの作成から始めましょう
コマンドラインでモデルを作成すると、フォルダにモデルを作成するように指定できます.モデル名の前にフォルダの名前を入力します.モデルがデフォルトのappフォルダに格納されていない場合は、これが役立ちます.
php artisan make:model Models/Product

app/ModelsフォルダにProductモデルが作成され、条件に合ったフォルダにモデルを移動する時間を節約できます.
2属性タイプの変換
$castsプロパティは、プロパティを特定のデータ型に強制的に変換する方法を提供します.
protected $casts = [
    'is_published' => 'boolean'
];

is_publishプロパティは、データベースにintegerが格納されている場合でも、アクセス時にbooleanタイプに強制的に変換されます.属性をdateやdatetimeなどの他のタイプに変換する方法もたくさんあります.
Bladeテンプレートファイルでdateとdatetimeをフォーマットするというエラーがよく見られます.
{{ $blog->created_at->format('Y-m-d') }}

一部のBladeテンプレートファイルでは、同じ変数で複数回フォーマットされていることがわかります.この問題は$castsプロパティによってより効率的に解決できます.
dateとdatetimeの変換プロパティでは、フォーマットを指定できます.
protected $casts = [
    'published_at' => 'datetime:Y-m-d',
];

これにより、published_は常にY-m-d形式で返されます.atプロパティなので、Bladeテンプレートファイルでフォーマットする必要はありません.
3表示するかどうか
一部の属性は、モデルの配列やJSON表現、例えばパスワード属性に含めるべきではありません.この時は$hidden属性が登場する時です.
protected $hidden = [
    'password'
];

$hidden*プロパティは、プロパティのブラックリストのようです.あるいは、*$visibleプロパティを使用して、プロパティのホワイトリストを設定することもできます.
protected $visible = [
    'first_name',
    'last_name'
];

モデルに$visible*プロパティが設定されている場合、他のプロパティは自動的に非表示になります.この方法は*$fillableと$guardedプロパティのようです.
4アクセサ
複数のプロパティを1つのプロパティにマージしたい場合や、プロパティをフォーマットしたい場合だけです.Laravelのアクセサを使用できます.
Userモデルがあり、first_を持っているとします.nameとlast_nameプロパティ.フルネームを表示したい場合は、次のようにします.
$this->first_name . ' ' . $this->last_name

これはとても無邪気なやり方です.Laravelでこの問題を解決する方法は、アクセサを使用することです.アクセサは、次の構文を使用してモデルにメソッドを定義します.
get[NameOfAttribute]Attribute

フルネームを取得するアクセスは、次のようになります.
public function getFullNameAttribute() {
    return "{$this->first_name} {$this->last_name}";
}

フルネームの値を取得するには、このようにアクセサを呼び出すだけです.
$user->full_name

5モディファイヤ
モディファイヤを使用すると、値を操作し、モデルの*$attributes*プロパティに操作値を設定できます.変数には、アクセサと同じ構文があります.
public function setLastNameAttribute($value) {
    $this->attributes['last_name'] = ucfirst($value);
}

このmutatorは、姓に*ucfirst*関数を適用し、結果を*$attributes*プロパティに格納します.
$user->last_name = 'jones'; //       `Jones`

6追加値
モデルにアクセサとモデルの関連付けがある場合、デフォルトではモデルの配列またはJSON表現には追加されません.そのため、モデルの$appendsプロパティにアクセサまたはモデル関連付けを追加する必要があります.次に、getFullNameAttributeアクセサの例を引き続き使用します.
$appends = [
    'full_name'
];

注意:
$appendsプロパティに追加されたアクセサは、アクセサがアルパカネーミング法で定義されている場合でも蛇ネーミング法で参照されます.
UserモデルとBlogモデルには一対多の関係があると仮定する.
public function blogs() {
    return $this->hasMany(App\Blog::class);
}

blogsをモデルに追加するには、$appendsプロパティに追加するだけです.
$appends = [
    'full_name',
    'blogs'
];

もちろん、追加するプロパティを指定できます.たとえば、blogのidとtitleだけをモデルに追加する必要がある場合.
$appends = [
    'full_name',
    'blogs:id,title'
];

7最後の仕上げ
あるモデルが別のモデルとBelongsToまたはBelongsToMany関連モデルの関係がある場合、たとえばCommentがBlogに属する場合、子データの更新時に親のタイムスタンプを同時に更新するのに役立つ場合があります.この問題は、$touchesプロパティに関係を追加することによって実現できます.
class Comment extends Model
{
    protected $touches = ['blog'];

    public function blog()
    {
        return $this->belongsTo(App\Blog::class);
    }
}

Commentモデルが更新されると、Blogモデルのupdated_も更新されます.at属性.