コードの可読性を向上させるための Laravel Eloquent の 6 つのヒント!

青灯夜游
リリース: 2022-11-15 20:08:01
転載
1868 人が閲覧しました

この記事では、コードの可読性を向上させるための 6 つの Laravel Eloquent のヒントをまとめて共有します。

コードの可読性を向上させるための Laravel Eloquent の 6 つのヒント!

Eloquent は、Laravel によってデフォルトで使用される ORM です。アクティブ記録モードが使用されます。より簡単な方法でデータベースを操作できるようになります。個々のモデルは、操作可能なデータベース内のテーブルを表します。この記事では、コードを改善するためにあまり知られていない隠された秘密、メソッド、プロパティを多かれ少なかれ紹介します。

#ヘビの命名属性

ヘビの命名属性は興味深い属性です。コードの内容を見てみましょう:

/**
 * 指示是否在数组上使用蛇形大小写属性。
 *
 * @var bool
 */
public static $snakeAttributes = true;
ログイン後にコピー

このプロパティへのアクセス方法を変更するためにこのプロパティを誤って使用することがよくあります。多くの人は、このプロパティを変更すると、キャメルケースの注釈を使用してプロパティに簡単にアクセスできると信じています。しかし実際にはそうではありません。使用しないことを強くお勧めします。モデルを配列として出力する場合、属性をキャメルケースにするかスネークケースにするかを定義するだけです。

キャメルケースに基づいて名前を付けたい場合は、Kirk Bushell のパッケージ

Eloquence by Kirk Bushell をチェックすることをお勧めします。

Pagination

Laravel の Eloquent ORM を使用している場合、これは朗報です。すぐに使用できるページネーション方法を提供します。次のような記述に慣れているかもしれません:

$comments = Comment::paginate(20);
ログイン後にコピー

この方法を使用すると、1 ページあたり 20 エントリでコメント モデルをページ分割できます。この値を変更して、ページごとに表示されるアイテムの数を定義します。何も指定しない場合は、デフォルト値の 15 が適用されます。

コメントをサイト上の複数の場所に表示したいとします。 1 ページあたり常に 30 件のコメントがあります。どこにでもパラメーター 30 を渡す必要がある場合、それは問題です。したがって、新しいデフォルト値をモデルに直接設定できます。

protected $perPage = 30;
ログイン後にコピー

モデルにカスタム値を追加する

Eloquent には「アクセサー」と呼ばれる強力な機能があります。この機能を使用すると、モデルに存在しないカスタム フィールドをモデルまたはテーブルに追加できます。既存の値を使用するか、まったく新しい値を定義するかは関係なく、いつでもフォールバックできます。以下はアクセサーがどのように機能するかの例です。

user という名前のモデルがあるとします。これに FullName アクセサーを追加します。

function getFullNameAttribute() {
    return sprintf('%s %s', $this->first_name, $this->last_name);
}
ログイン後にコピー

これで、次のように、ポスト モデルの

full_name 属性にアクセスできるようになります。

User::latest()->first()->full_name;
ログイン後にコピー

オブジェクト (コレクションなど) が返された場合、このプロパティはユーザー モデルにアタッチされません。 protected

$appends 属性をモデルに追加します。 1 つ以上のフィールドを含む配列を受け入れます。これらのフィールドは今後自動的に追加されます。次のように書くだけです:

protected $appends = ['full_name'];
ログイン後にコピー

存在しない列にミューテーター (プロパティ セッター) を追加します

ミューテーターはゲッターの反対です。これを使えば本当に面白いことができます。たとえば、さまざまな種類の入力を変換します。詳しく教えてください。あるタイプの期間を保存したいとします。一般に、常に可能な限り最小単位を保存します。私たちの場合は秒です。 UX 上の理由から、ユーザーは、ある場所では分、別の場所では時間など、秒を入力することを好みません。これはすべてすぐに解決できます。

class Video extends Model
{
    public function setDurationInMinutes($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60;
    }

    public function setDurationInHours($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60 * 60;
    }
}
ログイン後にコピー

上記のコードは、データ テーブル自体に存在しないフィールドを使用できることを意味します。

duration_in_ minutes
フィールドは model で使用されていますが、バックグラウンドでは duration_in_seconds を使用して更新するか、存在しないフィールド duration_in_hours を使用することもできます。 。このロジックに従って、コントローラー内で次のように呼び出します。

class AnyController
{
    public function store()
    {
        $video->update([
            'title' => request('title'),
            'duration_in_minutes' => request('duration_in_minutes'),
        ]);
    }
}
ログイン後にコピー

これにより、コントローラー内で計算を行う時間を節約できます。特定の計算を実行するときに、単純に存在しない列を使用して ## を使用できます。 #mutator

その結果を正しいフィールドにマップします。 熱心な読み込み: $with で

#人間関係について話しましょう。デフォルトでは、Laravel は遅延読み込みを使用します。これは人間関係の観点から何を意味しますか?遅延読み込みの利点は、すべてのデータを保持する必要がなく、必要なときにデータをロードできるため、メモリを節約できることです。次のようになります。

$comments = Comment::all();
foreach ($comments as $comment) {
    echo $comment->user->name;
}
ログイン後にコピー

上記の例では、すべてのコメント データを取得します。次に、コメントを繰り返し処理し、各コメントのユーザー名を表示します。このコードには何も問題はなく、正常に動作しますが、問題が発生しました。遅延読み込みにより、ユーザー名を出力する場合にのみユーザーを取得するクエリが実行されるようになりました。

最初の N 1 の質問へようこそ。なぜN1なのか? N は常にレビューの数で、1 はレビューを取得するためのクエリです。たとえば、レビューが 500 件ある場合、すべてのレビューを取得するクエリが 1 回トリガーされ、その後、対応するユーザーごとのレビューを取得するクエリが 1 回トリガーされます。つまり、1 つのクエリに対して 500 です。これは、アノテーションの数が増加すると、クエリの数も増加することを意味します。

これを防ぐために、eagerloadingという方法があります。

$comments = Comment::with('user')->get();
foreach ($comments as $comment) {
    echo $comment->user->name;
}
ログイン後にコピー

这会以两个查询结束。第一个查询获取所有注释,第二个查询立即获取所有关联用户。在后台,会发生以下情况(简化版SQL):

SELECT id, user_id, body FROM comments;
SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);
ログイン後にコピー

不论是 10、500 还是 10000 条评论数据都不重要,我们都依旧只执行两次SQL查询。

好了,你现在已经看到如何使用渴求式加载了。但只限于如何手动使用。你还可以将整个过程自动化,以便某些关联关系总是自动通过渴求式方式加载。为此,需要给模型设定一个属性。

protected $with = [];
ログイン後にコピー

我们可以在Comment model简单设置 protected $with = ['user'];, 从现在起,user在任何时候都会自动加载。

我们还有很多种渴求式加载,有仅加载特定列、嵌套即时加载、多个即时加载等等。更多详情请Laravel文档或深入核心。

modelKeys 方法

有的时候需要查询所有的主键 ID, 查询是否复杂并不重要,大多数人可能会像这样做:

User::all()->pluck('id');
ログイン後にコピー

这个操作很 nice,但是返回的是一个集合,想要转换成数组的话可以使用 toArray()

User::all()->pluck('id')->toArray();
ログイン後にコピー

大多数情况下,上面的操作的可以简化成这样:

User::all()->modelKeys();
ログイン後にコピー

这种方式返回一个数组。重要的是这个方法并不会总是返回 id。 顾名思义,他是以数组的形式返回所有模型主键。主键默认是id,同时也可以在模型中定义主键名。

protected $primaryKey = 'id';
ログイン後にコピー

原文地址:https://laravel-news.com/6-eloquent-secrets

译文地址:https://www.php.cn/link/c7decb5ce28209911b545d0b1059c5e3

【相关推荐:laravel视频教程

以上がコードの可読性を向上させるための Laravel Eloquent の 6 つのヒント!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート