EloquesntとCollectionについて
Eloquentとモデルクラス
DBクラスの他にも、Laravelにはデータベースの機能が用意されています。
それは「Eloquent」です。
Eloquentの基本的な使い方については下記にて解説していますので、参考にしてください。
laravelのEloquentやORMについて解説します。
モデルの基本的なルール
Eloquentは、Laravelであらかじめ決められている規約に従ってモデルを作成します。
モデルに関する基本的な規約を整理しておきましょう。
クラスはApp名前空間に配置
モデルクラスはApp名前空間に置かれます。スクリプトファイルはプロジェクトの「app」フォルダ内に作成されます。
Modelクラスを継承
モデルクラスはEloquent名前空間に用意されているModelクラスを継承して作成されます。
クラス名はテーブルの単数形
モデルクラスは参照するテーブルの単数刑をクラス名として指定します。テーブルは通常複数系の名前が付けられておりますからです。もし、usersというテーブルがある場合、それを参照するクラスはuserという名前になります。
もし、クラス名と異なる名前のテーブルを利用する場合は、モデルクラスに下記のプロパティを使用してテーブル名を指定します。
1 |
protexted $table = 'テーブル名'; |
プライマリキーは「id」プロパティ
モデルクラスはテーブルに設定されているプライマリキーが「id」という名前の整数のフィールドであるという前提で機能します。
もしid以外の名前のフィールドをプライマリキーとして設定している場合は、次の様にプロパティを用意する必要があります。
1 |
protexted $primaryKey = 'フィールド名'; |
プライマリキーはint型
テーブルのプライマリキーは整数型(int)である必要があります。
もし、文字列など他の型で指定している場合は下記の様に設定しましょう。
1 |
protexted $incrementing = false; |
また、整数以外の型がプライマリキーとして使用されている場合は次のプロパティを使用して型名を指定する必要があります。
1 |
protexted $keyType = '型名'; |
created_at及びupdate_atは自動設定
モデルにはモデルの作成と更新に関するフィールドを用意することができます。created_atは作成された日時、update_atは更新された日時を保管します。
どちらもdatetime型のフィールドとして用意します。これらは保存や更新の際に値を設定する必要がなく、Eloquentが自動で値をセットしてくれます。
もし、自動でセットしたい場合は次のプロパティを用意する必要があります。
1 |
protexted $tamestamps = false; |
モデルとコレクション
モデルから取得されたレコード類は、コレクションとして返されます。
これはEloquent名前空間にある「Collection」クラスのインスタンスです。コレクションはイテレータの機能も持っており、foreachなどを使用した繰り返し処理を使ってレコードを取得することも可能です。
イテレータとは、配列の方はデータ構造の要素を簡潔に繰り返して処理していく際に簡潔に記述できる構文やオブジェクトです。
コレクションには取得したいレコード1つひとつが、対応するモデルクラスのインスタンスとして保管されます。これがEloquentの大きな特徴の1つです。
モデルを使用して取得されるのはモデルクラスのインスタンスです。レコードに含まれる値が全てプロパティとして保管されており、このインスタンスから必要な値を取り出して使うことができます。
rejectとfilter : コレクションの機能
reject:データを排除する
「reject」メソッドは特定のレコードをコレクションから排除します。
1 |
<Collection>->reject(function(引数){…}); |
rejectはクロージャを引数にもちます。
このクロージャの関数は引数を1つ持ち、そこにコレクションから取り出されたモデルインスタンスを順に渡します。
このクロージャは関数の戻り値を持っています。これは真偽値で、trueを返せばそのオブジェクトはコレクションから排除されます。falseの場合はそのまま保持します。
filter:データを取得する
「filter」メソッドはrefectメソッドの反対の動きをします。
1 |
<Collection>->filter(function(引数){…}); |
引数にクロージャが用意され、クロージャの戻り値がtrueのものが受け入れられ、falseのものが排除されます。filterの戻り値はtrueが返されたモデルがコレクションとしてまとめられたものになります。
diff:差分を取得する
「diff」メソッドは複数の検索を行った際の差分を取りたい場合に使用されます。
1 |
<Collection>->diff(<Collection>); |
引数には比較するコレクションを指定し、両コレクションに含まれないモデルをまとめたコレクションを返します。
modelKey:キーだけ取り出す
「modelKey」はコレクションにまとめられているモデルのIDだけを配列にまとめて返します。戻り値は配列です。
1 |
<Collection>->modelKeys(); |
only:配列にまとめたIDのモデルを取得
引数にはIDに値をまとめた配列を指定し、配列にまとめてあるIDのモデルだけを取り出します。
1 |
<Collection>->only(配列); |
except:配列にまとめたID以外のモデルを取得
引数にはIDに値をまとめた配列を指定し、配列にまとめてあるIDのモデル以外を取り出します。
1 |
<Collection>->except(配列); |
merge:2つのコレクションを1つにまとめる
「merge」は引数に指定したコレクションを1つにまとめたものを返します。
同じが既にあった場合は上書きされます。(mergeでも作成されるコレクションはユニークです。)
1 |
<Collection>->merge(<Collection>); |
unique:ユニークなコレクションを返す
「unique」はコレクション内から重複するモデルを取り除いてユニークにしたものを返却します。
1 |
<Collection>->unique; |
map:コレクション生成
「map」は配列を元に新しいコレクションを生成します。
1 |
<Collection>->map(function($値, $キー){…}); |
mapはクロージャを引数に持つメソッドです。コレクションから取得した値とキーが引数に渡され、これをもとに新たなコレクションを保管する値を生成し、returnします。戻り値はクロージャでreturnされた値をコレクションにまとめたものになります。