


PHP の Laravel フレームワークにおける Eloquent オブジェクト リレーショナル マッピングの使用の詳細な説明、laraveleloquent_PHP チュートリアル
PHPのLaravelフレームワーク、laraveleloquent
zeroでのEloquentオブジェクトリレーショナルマッピングの使用の詳細な説明、Eloquentとは何ですか
Eloquent は Laravel の「ORM」、つまり「Object Relational Mapping」、オブジェクト リレーショナル マッピングです。 ORM の登場は、データベース操作をより便利にするために役立ちます。
Eloquent では、「モデル クラス」をデータベース テーブルに対応させることができ、最下層に多くの「関数」をカプセル化するため、モデル クラスの呼び出しが非常に便利になります。
次のコードを見てみましょう:
'protected $fillable = [];' このコード行には、ジェネレーターによって自動的に生成されるため、ここでは説明しません。
このクラスには、指定された名前空間もコンストラクターもありません。無意味なコード行が含まれていない場合、このファイルには 'Article' と 'Eloquent' という 2 つの意味のあるものだけが存在します。そうです、Eloquent はとても素晴らしいのです。Eloquent クラスを継承するだけで、「first() find() where() orderBy()」など、非常に多くのことが実行できます。これが object- の強力な機能です。指向性のある。
1. Eloquentの基本的な使い方
雄弁な中国語ドキュメントは次の場所にあります: http://laravel-china.org/docs/eloquent
さっそく、以下に Eloquent のいくつかの一般的な使用法のコードを直接示します。
ID 2 の記事を検索し、そのタイトルを出力します
リーリー「I am the title」というタイトルの記事を見つけて、ID を印刷します
リーリーすべての記事をクエリし、すべてのタイトルをループで出力します
リーリーIDが10~20のすべての記事を検索し、すべてのタイトルを印刷します
リーリーすべての記事をクエリしてループ内ですべてのタイトルを出力し、updated_at によって逆順に並べ替えます
リーリー基本的なご利用ポイント
1. Eloquent を継承するすべてのクラスには 2 つの「固定使用法」「Article::find($number)」「Article::all()」があります。前者はデータベースから取得した値を持つオブジェクトを取得します。その結果、データベース全体を含むオブジェクトのコレクションが生成されます。
2. 「where()」「orderBy()」などのすべての中間メソッドは、「静的」呼び出しと「非静的チェーン」呼び出し、つまり「Article::where()...」の両方をサポートできます。および「Article::....->where()」。
3. すべての「非固定使用法」呼び出しには、「終了」するための操作が必要です。「->get()」と「->first()」という 2 つの「終了操作」があります。
2. 中間操作の流れ
Builder という言葉は直訳するとコンストラクターとなりますが、データベース操作はほとんどが連鎖操作であるため、「中間操作フロー」の方が理解しやすいです。
中間操作フロー、コードを参照してください:
リーリーこのコードの `::where()->where()->orderBy()` は中間の操作フローです。中間の操作フローはオブジェクト指向のアプローチを使用して理解され、次の 1 つの文に要約できます。
オブジェクトを作成し、そのプロパティを継続的に変更し、最後に操作を使用してデータベース操作をトリガーします。
中間操作フローのヒントを見つける方法
リーリー
その後、次のエラーが表示されます:
「ターミネーター」メソッド
いわゆる「ターミネーター」メソッドは、最後のデータベースクエリオペレーションをトリガーし、N 個の中間オペレーションフローメソッドが Eloquent オブジェクトを処理した後に戻り値を取得することを指します。
`first()` `get()` `paginate()` `count()` `delete()` は、より一般的に使用される「ターミネーター」メソッドの一部であり、中間操作フローの最後に表示されます。 SQL はデータベースを呼び出し、返されたデータを取得し、処理後に Article オブジェクトまたは Article オブジェクトのグループのコレクションを返します。
複雑な使用例
コードをコピーします コードは次のとおりです:
Article::where('id', '>', '100')->where('id', '<', '200')->orWhere('top', 1)-> ;belongsToCategory()->where('category_level', '>', '1')->paginate(10);
3. モデル間の関係(関連付け)
1. 一対一の関係
User と Account の 2 つのモデルがあり、それぞれ登録ユーザーと消費者に対応し、Eloquent が提供する 1 対 1 の関係メソッドを使用するとします。次のようになるはずです:
リーリー
User モデル内の対応する Account テーブル情報をクエリする必要があると仮定すると、コードは次のようになります。 `/app/models/User.php`:リーリー
それでは、この関係性を使う必要があるとき、どう使えばいいのでしょうか?以下の通り:リーリー
この時に取得した`$account`は`Account`クラスのインスタンスです。
这里最难的地方在于后面的两个 foreign_key 和 local_key 的设置,大家可以就此记住:在 User 类中,无论 hasOne 谁,第二个参数都是 `user_id`,第三个参数一般都是 `id`。由于前面的 `find(10)` 已经锁定了 id = 10,所以这段函数对应的 SQL 为: `select * from account where user_id=10`。
这段代码除了展示了一对一关系该如何使用之外,还传达了三点信息,也是我对于大家使用 Eloquent 时候的建议:
(1). 每一个 Model 中都指定表名
(2). has one account 这样的关系写成 `hasOneAccount()` 而不是简单的 `account()`
(3). 每次使用模型间关系的时候都写全参数,不要省略
相应的,如果使用 belongsTo() 关系,应该这么写:
<?php class Account extends Eloquent { protected $table = 'accounts'; public function belongsToUser() { return $this->belongsTo('User', 'user_id', 'id'); } }
2.一对多关系
学会了前面使用一对一关系的基础方法,后面的几种关系就简单多了。
我们引入一个新的Model:Pay,付款记录。表结构应该是这样的:
user: id ... ... pay: id ... ... user_id
User 和 Pay 具有一对多关系,换句话说就是一个 User 可以有多个 Pay,这样的话,只在 Pay 表中存在一个 `user_id` 字段即可。 `/app/models/User.php`:
<?php class User extends Eloquent { protected $table = 'users'; public function hasManyPays() { return $this->hasMany('Pay', 'user_id', 'id'); } }
然后,当我们需要用到这种关系的时候,该如何使用呢?如下:
$accounts = User::find(10)->hasManyPays()->get();
此时得到的 `$accounts` 即为 `Illuminate\Database\Eloquent\Collection` 类的一个实例。大家应该也已经注意到了,这里不是简单的 `-> hasOneAccount` 而是 `->hasManyPays()->get()`,为什么呢?因为这里是 `hasMany`,操作的是一个对象集合。
相应的 belongsTo() 的用法跟上面一对一关系一样:
<?php class Pay extends Eloquent { protected $table = 'pays'; public function belongsToUser() { return $this->belongsTo('User', 'user_id', 'id'); } }
3.多对多关系
多对多关系和之前的关系完全不一样,因为多对多关系可能出现很多冗余数据,用之前自带的表存不下了。
我们定义两个模型:Article 和 Tag,分别表示文章和标签,他们是多对多的关系。表结构应该是这样的:
article: id ... ... tag: id ... ... article_tag: article_id tag_id
在 Model 中使用:
<?php class Tag extends Eloquent { protected $table = 'tags'; public function belongsToManyArticle() { return $this->belongsToMany('Article', 'article_tag', 'tag_id', 'article_id'); } }
需要注意的是,第三个参数是本类的 id,第四个参数是第一个参数那个类的 id。
使用跟 hasMany 一样:
$tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get();
这里会得到一个非常复杂的对象,可以自行 `var_dump()`。跟大家说一个诀窍,`var_dump()` 以后,用 Chrome 右键 “查看源代码”,就可以看到非常整齐的对象/数组展开了。
在这里给大家展示一个少见用法(奇技淫巧):
public function parent_video() { return $this->belongsToMany($this, 'video_hierarchy', 'video_id', 'video_parent_id'); } public function children_video() { return $this->belongsToMany($this, 'video_hierarchy', 'video_parent_id', 'video_id'); }
对,你没有看错,可以 belongsToMany 自己。
其他关系
Eloquent 还提供 “远层一对多关联”、“多态关联” 和 “多态的多对多关联” 这另外三种用法,经过上面的学习,我们已经掌握了 Eloquent 模型间关系的基本概念和使用方法,剩下的几种不常用的方法就留到我们用到的时候再自己探索吧。
重要技巧:关系预载入
你也许已经发现了,在一对一关系中,如果我们需要一次性查询出10个 User 并带上对应的 Account 的话,那么就需要给数据库打 1 + 10 条 SQL,这样性能是很差的。我们可以使用一个重要的特性,关系预载入:http://laravel-china.org/docs/eloquent#eager-loading
直接上代码:
$users = User::with('hasOneAccount')->take(10)->get()
这样生成的 SQL 就是这个样子的:
select * from account where id in (1, 2, 3, ... ...)
这样 1 + 10 条 SQL 就变成了 1 + 1 条,性能大增。
您可能感兴趣的文章:
- Laravel 5框架学习之Eloquent 关系
- Laravel 5框架学习之Eloquent (laravel 的ORM)
- Laravel模板引擎Blade中section的一些标签的区别介绍
- Laravel 5.0 发布 新版本特性详解
- Laravel实现用户注册和登录
- 推荐几款用 Sublime Text 开发 Laravel 所用到的插件
- 跟我学Laravel之视图 & Response
- 跟我学Laravel之安装Laravel
- 跟我学Laravel之快速入门
- Laravel框架表单验证详解
- Laravel框架中扩展函数、扩展自定义类的方法
- Laravel框架路由配置总结、设置技巧大全
- PHP开发框架Laravel数据库操作方法总结

ホット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)

ホットトピック









PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

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

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。
