目次
1. インクリメントとデクリメント
2. メソッドの実行 メソッド X の実行に失敗した場合、メソッド Y が実行されます。
Eloquent モデルには、
関連付けを定義する一般的な方法:
Eloquent モデルには、クラスの属性形式を使用するいくつかのパラメーターがあります。最も一般的に使用されるものは次のとおりです:
誰もが
これを行うためのエレガントな方法がありますコードの種類:
より複雑な「テクニック」。フォーラムのトピックを最新の投稿順に並べ替えますか?フォーラムの上部に最新の更新トピックを表示するのは一般的な要件ですよね。
多くの人は、次のようにクエリ条件を記述するために "if-else" を使用することを好みます:
記事の作成者を表示したい状況があり、テンプレート コードは次のとおりであるとします。
次のコードがあると想像してください:
13. 原生查询方法
14. 复制:复制一行的副本
15. Chunk() 方法之大块数据
16. 创建模型时创建额外的东西
17. 调用 save 方法的时候指定 updated_at
18. update() 的结果是什么?
19. 把括号转换成 Eloquent 查询
20. 复数参数的 orWhere
ホームページ PHPフレームワーク Laravel Laravel でよく使われる雄弁な必須実践スキル

Laravel でよく使われる雄弁な必須実践スキル

Jun 13, 2020 pm 06:24 PM

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-&gt;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-&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><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-&gt;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 查询

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

どちらが良いのか、DjangoとLaravel? どちらが良いのか、DjangoとLaravel? Mar 28, 2025 am 10:41 AM

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

LaravelとThe BackEnd:Webアプリケーションロジックの電源 LaravelとThe BackEnd:Webアプリケーションロジックの電源 Apr 11, 2025 am 11:29 AM

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

どちらがより良いPHPですか、それともLaravelですか? どちらがより良いPHPですか、それともLaravelですか? Mar 27, 2025 pm 05:31 PM

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

Laravelは紹介例 Laravelは紹介例 Apr 18, 2025 pm 12:45 PM

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

Laravelはフロントエンドですか、それともバックエンドですか? Laravelはフロントエンドですか、それともバックエンドですか? Mar 27, 2025 pm 05:31 PM

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

Laravelを学ぶ方法Laravelを無料で学ぶ方法 Laravelを学ぶ方法Laravelを無料で学ぶ方法 Apr 18, 2025 pm 12:51 PM

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

Laravelの汎用性:単純なサイトから複雑なシステムまで Laravelの汎用性:単純なサイトから複雑なシステムまで Apr 13, 2025 am 12:13 AM

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

Laravelユーザーログイン機能 Laravelユーザーログイン機能 Apr 18, 2025 pm 12:48 PM

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

See all articles