Laravel でよく使われる雄弁な必須実践スキル
Eloquent ORM は単純なメカニズムのように見えますが、その内部には、より多くの機能を実現するための半隠された機能とあまり知られていない方法が数多くあります。この記事では、いくつかのヒントを紹介します。
1. インクリメントとデクリメント
次の実装を置き換えるには:
$article = Article::find($article_id); $article->read_count++; $article->save();
これを実行できます:
$article = Article::find($article_id); $article->increment('read_count');
次のメソッドも実装できます。
Article::find($article_id)->increment('read_count'); Article::find($article_id)->increment('read_count', 10); // +10 Product::find($produce_id)->decrement('stock'); // -1
2. メソッドの実行 メソッド X の実行に失敗した場合、メソッド Y が実行されます。
例 1 --
findOrFail(): 次のコードの実装を置き換えるには:
$user = User::find($id); if (!$user) { abort (404); }
次のように記述できます:
$user = User::findOrFail($id);
例 2 --
firstOrCreate(): 次のコードの実装を置き換えるには:
$user = User::where('email', $email)->first(); if (!$user) { User::create([ 'email' => $email ]); }
これを書くだけです:
$user = User::firstOrCreate(['email' => $email]);
3 . モデルの boot() メソッド
Eloquent モデルには、
boot() と呼ばれる魔法の場所があり、ここでデフォルトの動作をオーバーライドできます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class User extends Model
{
public static function boot()
{
parent::boot();
static::updating(function($model)
{
// 写点日志啥的
// 覆盖一些属性,类似这样 $model->something = transform($something);
});
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
モデル オブジェクトの作成時に特定のフィールドの値を設定することは、おそらく最も一般的な例の 1 つです。モデル オブジェクトの作成時に UUID フィールドを生成したい場合に何をすべきかを見てみましょう。
public static function boot() { parent::boot(); self::creating(function ($model) { $model->uuid = (string)Uuid::generate(); }); }
4. 条件とソートによる関連付け
関連付けを定義する一般的な方法:
public function users() { return $this->hasMany('App\User'); }
知っていますか?上記に基づいて
where または orderBy
?\ を追加することもできます。たとえば、特定の種類のユーザーを関連付け、メール フィールドを使用して並べ替える場合などです。 , あなたはこれを行うことができます:
public function approvedUsers() { return $this->hasMany('App\User')->where('approved', 1)->orderBy('email'); }
5. モデルの特性: 時間、追加など.
Eloquent モデルには、クラスの属性形式を使用するいくつかのパラメーターがあります。最も一般的に使用されるものは次のとおりです:
class User extends Model { protected $table = 'users'; protected $fillable = ['email', 'password']; // 可以被批量赋值字段,如 User::create() 新增时,可使用字段 protected $dates = ['created_at', 'deleted_at']; // 需要被Carbon维护的字段名 protected $appends = ['field1', 'field2']; // json返回时,附加的字段 }
これらだけでなく:
protected $primaryKey = 'uuid'; // 更换主键 public $incrementing = false; // 设置 不自增长 protected $perPage = 25; // 定义分页每页显示数量(默认15) const CREATED_AT = 'created_at'; const UPDATED_AT = 'updated_at'; //重写 时间字段名 public $timestamps = false; // 设置不需要维护时间字段
他にもあります。興味深い機能をいくつか列挙しただけです。詳細については、ドキュメントの抽象モデル クラスを参照してください。
6. ID による複数のレコードのクエリ
誰もが
find() メソッドを知っていますよね。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$user = User::find(1);</pre><div class="contentsignin">ログイン後にコピー</div></div>
このメソッドがパラメータとして複数の ID の配列を受け入れることができることを知っている人がほとんどいないことに非常に驚きました:
$users = User::find([1,2,3]);
7.どこX
これを行うためのエレガントな方法がありますコードの種類:
$users = User::where('approved', 1)->get();
は次のコードに変換されます:
$users = User::whereApproved(1)->get();
はい、正しく読みました。フィールド名をサフィックスとして使用し、それを
の最後に追加します。 where で合格します。 魔法の方法が機能します。 さらに、Eloquent には時間に関連する事前定義されたメソッドがいくつかあります:
User::whereDate('created_at', date('Y-m-d')); User::whereDay('created_at', date('d')); User::whereMonth('created_at', date('m')); User::whereYear('created_at', date('Y'));
8. 関係による並べ替え
より複雑な「テクニック」。フォーラムのトピックを最新の投稿順に並べ替えますか?フォーラムの上部に最新の更新トピックを表示するのは一般的な要件ですよね。
まず、トピックの最新の投稿に対して別の関係を定義します:
public function latestPost() { return $this->hasOne(\App\Post::class)->latest(); }
次に、コントローラーでこの「魔法」を実装できます:
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
9。 Eloquent::when() -- もう if-else を使用する必要はありません
多くの人は、次のようにクエリ条件を記述するために "if-else" を使用することを好みます:
if (request('filter_by') == 'likes') { $query->where('likes', '>', request('likes_amount', 0)); } if (request('filter_by') == 'date') { $query->orderBy('created_at', request('ordering_rule', 'desc')); }
もっと良い方法がありますメソッド --
when()<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});</pre><div class="contentsignin">ログイン後にコピー</div></div>
を使用する あまり洗練されていないように見えますが、その強力な機能はパラメータを渡すことです:
$query = User::query(); $query->when(request('role', false), function ($q, $role) { return $q->where('role_id', $role); }); $authors = $query->get();
10。 return デフォルトのモデル オブジェクト
記事の作成者を表示したい状況があり、テンプレート コードは次のとおりであるとします。
{{ $post->author->name }}
ただし、作成者の情報が削除されているか、設定されていない場合は、何らかの理由で。コードは「非オブジェクトのプロパティ」などのエラーを返します。
もちろん、次のように処理できます:
{{ $post->author->name ?? '' }}
Eloquent リレーションシップを通じてこれを行うことができます:
public function author() { return $this->belongsTo('App\Author')->withDefault(); }
この例では、テキストに著者情報が含まれていない場合、 ,
author () は空の App\Author
モデル オブジェクトを返します。 さらに、デフォルト モデル オブジェクトのプロパティにデフォルト値を割り当てることもできます。
public function author() { return $this->belongsTo('App\Author')->withDefault([ 'name' => 'Guest Author' ]); }
11. 代入関数による並べ替え
次のコードがあると想像してください:
function getFullNameAttribute() { return $this->attributes['first_name'] . ' ' . $this->attributes['last_name']; }
さて、「full_name」で並べ替えたいですか? 効果がないことがわかりました。 :
$clients = Client::orderBy('full_name')->get(); //没有效果
解決策は非常に簡単です。結果を取得した後に結果を並べ替える必要があります。
$clients = Client::get()->sortBy('full_name'); // 成功!
メソッド名が異なることに注意してください。orderBy ではなく、sortBy
12. グローバル スコープでのデフォルトの並べ替え
User::all() が必要な場合は、常に name
フィールドに従います。並べ替えについてはどうすればよいでしょうか。グローバル スコープを割り当てることができます。 boot()
に戻りましょう。上で説明したこのメソッド: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">protected static function boot()
{
parent::boot();
// 按照 name 正序排序
static::addGlobalScope('order', function (Builder $builder) {
$builder->orderBy('name', 'asc');
});
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
拡張読み取りクエリ スコープ。
13. 原生查询方法
有时候,我们需要在 Eloquent 语句中添加原生查询。 幸运的是,确实有这样的方法。
// whereRaw $orders = DB::table('orders') ->whereRaw('price > IF(state = "TX", ?, 100)', [200]) ->get(); // havingRaw Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get(); // orderByRaw User::where('created_at', '>', '2016-01-01') ->orderByRaw('(updated_at - created_at) desc') ->get();
14. 复制:复制一行的副本
很简单。说明不是很深入,下面是复制数据库实体(一条数据)的最佳方法:
$task = Tasks::find(1); $newTask = $task->replicate(); $newTask->save();
15. Chunk() 方法之大块数据
与 Eloquent 不完全相关,它更多的关于 Collection (集合),但是对于处理大数据集合,仍然是很有用的。你可以使用 chunk() 将这些数据分割成小数据块
修改前:
$users = User::all(); foreach ($users as $user) { // ...
你可以这样做:
User::chunk(100, function ($users) { foreach ($users as $user) { // ... } });
16. 创建模型时创建额外的东西
我们都知道Artisan命令:
php artisan make:model Company
但是,你知道有三个有用的标记可以为模型生成相关文件吗?
php artisan make:model Company -mcr
-m 将创建一个迁移文件
-c 将创建一个控制器
-r 表示控制器应该是一个资源控制器
17. 调用 save 方法的时候指定 updated_at
你知道 ->save()
方法可以接受参数吗? 我们可以通过传入参数阻止它的默认行为:更新 updated_at
的值为当前时间戳。
$product = Product::find($id); $product->updated_at = '2019-01-01 10:00:00'; $product->save(['timestamps' => false]);
这样,我们成功在 save
时指定了 updated_at
的值。
18. update() 的结果是什么?
你是否想知道这段代码实际上返回什么?
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
我是说,更新操作是在数据库中执行的,但 $result
会包含什么?
答案是受影响的行。 因此如果你想检查多少行受影响, 你不需要额外调用其他任何内容 -- update()
方法会给你返回此数字。
19. 把括号转换成 Eloquent 查询
如果你有个 and
和 or
混合的 SQL 查询,像这样子的:
... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
怎么用 Eloquent 来翻译它呢? 下面是一种错误的方式:
$q->where('gender', 'Male'); $q->orWhere('age', '>=', 18); $q->where('gender', 'Female'); $q->orWhere('age', '>=', 65);
顺序就没对。正确的打开方式稍微复杂点,使用闭包作为子查询:
$q->where(function ($query) { $query->where('gender', 'Male') ->where('age', '>=', 18); })->orWhere(function($query) { $query->where('gender', 'Female') ->where('age', '>=', 65); })
20. 复数参数的 orWhere
终于,你可以传递阵列参数给 orWhere()
。平常的方式:
$q->where('a', 1); $q->orWhere('b', 2); $q->orWhere('c', 3);
你可以这样做:
$q->where('a', 1); $q->orWhere(['b' => 2, 'c' => 3]);
我很确定还有更多隐藏的秘诀,但我希望至少上面的其中一些对你来说是新的。
推荐教程:《Laravel教程》
以上がLaravel でよく使われる雄弁な必須実践スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











DjangoとLaravelはどちらもフルスタックのフレームワークです。 DjangoはPython開発者や複雑なビジネスロジックに適していますが、LaravelはPHP開発者とエレガントな構文に適しています。 1.DjangoはPythonに基づいており、迅速な発展と高い並行性に適した「バッテリーコンプリート」哲学に従います。 2. LaravelはPHPに基づいており、開発者エクスペリエンスを強調しており、小規模から中規模のプロジェクトに適しています。

Laravelはバックエンドロジックでどのように役割を果たしますか?ルーティングシステム、Eloquentorm、認証と承認、イベントとリスナー、パフォーマンスの最適化を通じてバックエンド開発を簡素化および強化します。 1.ルーティングシステムにより、URL構造の定義とリクエスト処理ロジックが可能になります。 2.Eloquentormは、データベースの相互作用を簡素化します。 3.認証および承認システムは、ユーザー管理に便利です。 4.イベントとリスナーは、ゆるく結合したコード構造を実装します。 5.パフォーマンスの最適化により、キャッシュとキューイングを通じてアプリケーションの効率が向上します。

LaravelはPHPベースのフレームワークであるため、PHPとLaravelは直接匹敵するものではありません。 1.PHPは、シンプルで直接的であるため、小規模プロジェクトや迅速なプロトタイピングに適しています。 2。LARAVELは、豊富な機能とツールを提供するため、大規模なプロジェクトや効率的な開発に適していますが、急な学習曲線があり、純粋なPHPほど良くない場合があります。

Laravelは、Webアプリケーションを簡単に構築するためのPHPフレームワークです。次のような強力な機能を提供します。インストール:Laravel CLIを作曲家にグローバルにインストールし、プロジェクトディレクトリにアプリケーションを作成します。ルーティング:ルート/web.phpのURLとハンドラーの関係を定義します。ビュー:リソース/ビューでビューを作成して、アプリケーションのインターフェイスをレンダリングします。データベース統合:MySQLなどのデータベースとのすぐ外側の統合を提供し、移行を使用してテーブルを作成および変更します。モデルとコントローラー:モデルはデータベースエンティティを表し、コントローラーはHTTP要求を処理します。

laravelisabackendframeworkbuiltonphp、designforwebapplicationdevelopment.itfocusonserver-sidelogic、databasemanagement、およびapplicationStructure、およびbueithedendtechnologiesvue.jsorreactforfull-stackdevelymentと統合されていること。

Laravelフレームワークを学びたいが、資源や経済的圧力に苦しんでいないのですか?この記事では、Laravelの無料学習を提供し、オンラインプラットフォーム、ドキュメント、コミュニティフォーラムなどのリソースを使用して、PHP開発の旅から習得するための堅実な基盤を築く方法を教えてくれます。

Laravel Developmentプロジェクトは、さまざまなサイズと複雑さのニーズに合う柔軟性とパワーのために選択されました。 Laravelは、ルーティングシステム、Eloquentorm、Artisan Command Lineおよびその他の機能を提供し、簡単なブログから複雑なエンタープライズレベルのシステムへの開発をサポートしています。

Laravelは、ユーザーモデル(Eloquentモデル)の定義、ログインフォームの作成(ブレードテンプレートエンジン)、ログインコントローラーの作成(認証\ログインコントローラーの継承)、ログイン要求の検証(Auth ::試行)の検証など、ユーザーログイン機能を実装するための包括的なAuthフレームワークを提供します。ヘッダー。さらに、AUTHフレームワークは、パスワードのリセット、電子メールの登録と検証などの機能も提供します。詳細については、Laravelのドキュメントを参照してください:https://laravel.com/doc
