検索
ホームページPHPフレームワークLaravelLaravel でよく使われる雄弁な必須実践スキル

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()

と呼ばれる魔法の場所があり、ここでデフォルトの動作をオーバーライドできます: <pre class="brush:php;toolbar:false">class User extends Model {     public static function boot()     {         parent::boot();         static::updating(function($model)         {             // 写点日志啥的             // 覆盖一些属性,类似这样 $model-&gt;something = transform($something);         });     } }</pre> モデル オブジェクトの作成時に特定のフィールドの値を設定することは、おそらく最も一般的な例の 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()

メソッドを知っていますよね。 <pre class="brush:php;toolbar:false">$user = User::find(1);</pre>このメソッドがパラメータとして複数の 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()

<pre class="brush:php;toolbar:false">$query = Author::query(); $query-&gt;when(request('filter_by') == 'likes', function ($q) {     return $q-&gt;where('likes', '&gt;', request('likes_amount', 0)); }); $query-&gt;when(request('filter_by') == 'date', function ($q) {     return $q-&gt;orderBy('created_at', request('ordering_rule', 'desc')); });</pre> を使用する あまり洗練されていないように見えますが、その強力な機能はパラメータを渡すことです:

$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() に戻りましょう。上で説明したこのメソッド: <pre class="brush:php;toolbar:false">protected static function boot() {     parent::boot();     // 按照 name 正序排序     static::addGlobalScope('order', function (Builder $builder) {         $builder-&gt;orderBy('name', 'asc');     }); }</pre>拡張読み取りクエリ スコープ。

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 查询

如果你有个 andor 混合的 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 サイトの他の関連記事を参照してください。

声明
この記事はlearnkuで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Laravelの影響:Web開発の簡素化Laravelの影響:Web開発の簡素化Apr 21, 2025 am 12:18 AM

Laravelは、Web開発プロセスを簡素化し、強力な機能を提供することで際立っています。その利点には、1)簡潔な構文と強力なORMシステム、2)効率的なルーティングと認証システム、3)豊富なサードパーティライブラリサポート。開発者はエレガントなコードの作成に集中し、開発効率を向上させることができます。

Laravel:フロントエンドまたはバックエンド?フレームワークの役割を明確にしますLaravel:フロントエンドまたはバックエンド?フレームワークの役割を明確にしますApr 21, 2025 am 12:17 AM

laravelispredomintylyabackendframework、Designeforerver-sidelogic、databasemanagement、およびapidevelopmentが、BladeTemplatesで開発されたものです。

Laravel vs. Python:パフォーマンスとスケーラビリティの探索Laravel vs. Python:パフォーマンスとスケーラビリティの探索Apr 21, 2025 am 12:16 AM

LaravelとPythonには、パフォーマンスとスケーラビリティの点で独自の利点と短所があります。 Laravelは非同期処理とキューイングシステムを通じてパフォーマンスを向上させますが、PHPの制限により、高い並行性が存在する場合はボトルネックがある場合があります。 Pythonは、非同期フレームワークと強力なライブラリエコシステムでうまく機能しますが、Multi-Threaded環境のGILの影響を受けます。

Laravel vs. Python(フレームワーク付き):比較分析Laravel vs. Python(フレームワーク付き):比較分析Apr 21, 2025 am 12:15 AM

Laravelは、チームがPHPに精通しており、豊富な機能を必要とするプロジェクトに適していますが、Python Frameworksはプロジェクトの要件に依存します。 1.Laravelは、迅速な開発と柔軟性を必要とするプロジェクトに適したエレガントな構文とリッチな機能を提供します。 2。Djangoは、「バッテリー包含」の概念のため、複雑なアプリケーションに適しています。 3.Flaskは、高速プロトタイプや小規模プロジェクトに適しており、柔軟性が非常に高くなります。

LaravelのFrontEnd:可能性の調査LaravelのFrontEnd:可能性の調査Apr 20, 2025 am 12:19 AM

Laravelは、フロントエンド開発に使用できます。 1)ブレードテンプレートエンジンを使用して、HTMLを生成します。 2)Viteを統合して、フロントエンドリソースを管理します。 3)SPA、PWA、または静的Webサイトを構築します。 4)ルーティング、ミドルウェア、Eloquentormを組み合わせて、完全なWebアプリケーションを作成します。

PHPとLaravel:サーバー側のアプリケーションの構築PHPとLaravel:サーバー側のアプリケーションの構築Apr 20, 2025 am 12:17 AM

PHPとLaravelを使用して、効率的なサーバー側アプリケーションを構築できます。 1.PHPは、Web開発に適したオープンソーススクリプト言語です。 2.Laravelは、ルーティング、コントローラー、Eloquentorm、ブレードテンプレートエンジン、および開発を簡素化するためのその他の機能を提供します。 3.キャッシュ、コードの最適化、セキュリティ対策により、アプリケーションのパフォーマンスとセキュリティを改善します。 4.アプリケーションの安定した動作を確保するためのテストおよび展開戦略。

Laravel vs. Python:学習曲線と使いやすさLaravel vs. Python:学習曲線と使いやすさApr 20, 2025 am 12:17 AM

LaravelとPythonには、学習曲線と使いやすさの点で独自の利点と短所があります。 Laravelは、Webアプリケーションの迅速な発展に適しています。学習曲線は比較的フラットですが、高度な機能をマスターするには時間がかかります。 Pythonの文法は簡潔で、学習曲線はフラットですが、動的なタイプのシステムは注意する必要があります。

Laravelの強み:バックエンド開発Laravelの強み:バックエンド開発Apr 20, 2025 am 12:16 AM

バックエンド開発におけるLaravelの利点には、次のものがあります。1)エレガントな構文とEloquentorm開発プロセスを簡素化します。 2)豊富な生態系と積極的なコミュニティサポート。 3)開発効率とコードの品質の向上。 Laravelの設計により、開発者は強力な機能とツールを通じてより効率的に開発し、コードの品質を向上させることができます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。