Laravelの Eloquent について初心者の私が勉強した時に簡単にまとめてみました。
間違い等があれば、指摘お願いします。
Eloquentとは
DBとモデルオブジェクトを対応付ける機能。
Eloquentモデルでよく使うプロパティ
プロパティ | 説明 | 規定値 |
---|---|---|
$connection | どのDB接続するのか。onメソッドで動的に変更可 | |
$table | どのtableに対して処理するのか | (モデル名の複数形) |
$primaryKey | 主キーの設定 | id |
$incrementing | 主キーをオートインクリメントするかどうか | true |
$timestamps | テーブルの作成、更新日時を自動更新 | true |
$fillable | 渡した属性を複数代入させるかどうか(columnに値を入れたい場合必須) | null |
$guarded | 複数代入させないcolumnの指定($fillableと対) | [*] 全てのcolumnが複数代入できない |
$hidden | モデルを配列/JSON変換するときに隠蔽されるcolumnの指定 | null |
$visible | $hiddenと対 | [*] |
よく使うメソッド
メソッド名 | 内容 |
---|---|
find | 主キーを指定して検索 |
where | 検索条件を指定 orWhere や引数でAND, OR検索ができる |
count | 件数を取得する |
first | データを1件だけ取得する |
toArray | データを配列に変換 |
toJson | データをJSONに変換 |
create, save | データの作成。createの場合は、モデルのfillableの設定が必須 |
insert | 複数のデータを一括作成 |
update, save | データの更新 |
delete, destroy | データの削除。destroyは主キーを複数指定して削除可能 |
例
App\User::find(1);
=> App\User {
id: 1,
name: "hoge hoge",
email: "hoge@hoge.com",
created_at: "2015-11-11 11:11:11",
updated_at: "2015-11-11 11:11:11",
}
よく使う検索条件をメソッド化
メソッドの先頭にscopeをつけるとクエリスコープが定義できる。
呼び出しはscopeを外したメソッド名()
論理削除
設定
マイグレーションファイルに以下を追加
$table->softDeletes();
使用
use Illuminate\Database\Eloquent\SoftDeletes;
をモデルに追加して使用する。
通常のdelete
, destroy
でdeleted_atに削除時間がセットされる。
モデルでの検索時に論理削除したデータは結果に含まれない
メソッド
- withTrashed 論理削除したデータを検索結果に含める
- onlyTrashed 論理削除したデータのみ検索対象にする
- restore 論理削除したデータを復元する
- forceDelete 論理削除対象のモデルを物理削除する
リレーション
関係 | 親 | 子 | 備考 |
---|---|---|---|
1:1 | hasOne | belongsTo | |
1:N | hasMany | belongsTo | |
N:N | belongsToMany | belongsToMany | 中間テーブル必要 |
例
1:N
メールアドレス等を持ったusersテーブル(親)とつぶやき情報を持ったtweetsテーブル(子)があるとすると
Userモデル
class User extends Model
{
public function tweet()
{
return $this->hasMany(Tweet::class);
}
}
Tweetモデル
class Tweet extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
N+1問題対策
Eagerローディングはwith
メソッドを用いる。
例
上のusersとtweetsを例に、tweetに紐付いたユーザを取得し、表示したい場合等
$tweets = App\Tweet::with('user')->get();