ホームページ > 記事 > PHPフレームワーク > コードの可読性を向上させるための Laravel Eloquent の 6 つのヒント!
この記事では、コードの可読性を向上させるための 6 つの Laravel Eloquent のヒントをまとめて共有します。
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;
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 で
$comments = Comment::all(); foreach ($comments as $comment) { echo $comment->user->name; }
$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文档或深入核心。
有的时候需要查询所有的主键 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 サイトの他の関連記事を参照してください。