基礎知識

Eloquentの使い方 まとめ

2018/07/19

Laravel でのDB操作は 主に Eloquent (エロクアント)を使います。

Eloquent についての詳しい内容は以下を参照ください。

Eloquent の記述はいくつかあり、今回はそれをまとめてみます。

 

Eloquentメソッド

find()

例)id=1 のレコードを抽出(主キーで指定したモデル取得)


$user = \App\User::find(1);

 

findOrFail()

例)クエリー条件にマッチしたレコードがなかったときに例外処理をする


$user = \App\User::findOrFail(1);
$user = \App\User::where('active', '1')->firstOrFail();

 

where()

例)アクティブのユーザだけ抽出(クエリー条件にマッチしたレコード取得)


$users = \App\User::where('active', '=', 1)->get();

// '=' は省略してもいいです。
$users = \App\User::where('active', 1)->get();

// 最初のレコードだけ取得する場合
$user = \App\User::where('active', 1)->first();

POINT!

Whereメソッドを使う場合、複数の結果を取得する all()get() のような Eloquentメソッドが必要になります。

 

count()

集計関数も用意されています。


$count = \App\User::where('active', 1)->count();
$max = \App\User::where('active', 1)->max('price');

 

toArray()

コレクション を配列に変換するためには、toArrayメソッドを使って行うことができます。

コレクションとは

Eloquent が複数のレコードをリターンする場合、Illuminate\Database\Eloquent\Collection オブジェクトが返されます。このことから複数のレコードをEloqunetで抽出することをコレクションと呼んだりします。


$user = \App\User::all()->toArray();
dd($user);

出力結果


array:8 [▼
0 => array:5 [▼
"id" => 1
"name" => "デモ"
"email" => "demo@gmail.com"
"created_at" => "-0001-11-30 00:00:00"
"updated_at" => "-0001-11-30 00:00:00"
]
1 => array:5 [▶]
2 => array:5 [▶]
3 => array:5 [▶]
4 => array:5 [▶]
5 => array:5 [▶]
6 => array:5 [▶]
7 => array:5 [▶]
]

 

複雑な条件クエリー


SELECT * FROM users WHERE (pref = '京都' or pref= '大阪') 
AND (status= '1' or status= '2');

上のような複雑なSQLをEloquentで書く場合はこうなります。


$query = App\User::where(function($query){
    $query->orWhere('pref', '京都')
          ->orWhere('pref', '大阪');
})->where(function($query){
    $query->orWhere('status', '1')
          ->orWhere('status', '2');
});

変数を使うときは use を使います。


$query = App\User::where(function($query) use($pref1, $pref2){
    $query->orWhere('pref', $pref1)
          ->orWhere('pref', $pref2);
})->where(function($query) use ($status1, $status2){
    $query->orWhere('status', '1')
          ->orWhere('status', '2');
});

 

クエリースコープを使う

例)「人気のあるユーザ」&「アクティブなユーザ」


$users = \App\User::popular()->active()->get();

スコープの定義はモデルに記述します。


:
class User extends Model
{

// 人気のあるユーザ
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}

// アクティブなユーザ
public function scopeActive($query)
{
$query->where('active', true);
}

}

POINT!

スコープを定義する際、名前の付け方に注意!

動的スコープ(引数を受け取るスコープ)を定義したい場合は以下になります。


// データ検索
$User = new \App\User();
$User->email = $email;
$User->password = $password;

// スコープの使用例(クエリー条件)
$findData = $User->findUserEmailPassword()->first();

スコープの定義は以下のようになります。


:
class User extends Model
{

// eメール と パスワードをクエリー条件に指定
public function scopeFindUserEmailPassword()
{
return $this->where('email', $this->email)->where('password', $this->password);
}

}

 

新規レコードの挿入(CREATE)

コントローラーにて以下を記述。


public function store(Request $request)
{
// Userモデルのスンスタンスを生成
$user = new \App\User;

// 値の登録
$user->name = $request->name;

// 保存
$user->save();
}

この例ではやって来たHTTPリクエストの name パラメーターをApp\User モデルインスタンスの name属性に代入しています。

saveメソッドが呼ばれると新しいレコードがデータベースに挿入されます。

saveメソッドが呼び出されたときに created_at と updated_at タイムスタンプは自動的に設定されます。

 

レコードの更新処理(UPDATE)

コントローラーにて以下を記述。


public function edit(Request $request)
{
//レコードを検索
$user = \App\User::findOrFail($id);

//値を代入
$user->name = $request->name;

//保存(更新)
$student->save();
}

更新処理は基本的に作成処理と同じです。

違いはUserモデルのインスタンスを生成していないだけ。

save メソッドはデータベースで既に存在するレコードを更新するためにも使用されます。

レコードを更新するにはまず取得する必要があり、更新したい属性をセットしてから saveメソッドを呼び出します。

この場合も updated_at タイムスタンプは自動的に更新されます。

 

削除(DELETE)

コントローラにて以下を記述


public function delete($id){

// 削除対象レコードを検索
$user = \App\User::findOrFail($id);

// 削除
$user->delete();
}

削除するには、deleteメソッドを呼び出します。

findOrFailメソッドで該当レコードを取得してdeleteメソッドを実行。

 

リレーション

モデルを使ってテーブル間同士を結合することができます。

例)お気に入り機能

一人のユーザに対して複数のお気に入りを登録することができる

⇒ Userモデル:Bookmarkモデル = 1:N の関係

⇒ User hasMany Bookmarks / Bookmarks belongsTo User

Userモデル(:N)


class User extends Model 
{ 
public function bookmarks()
{ 
return $this->hasMany('App\Bookmark'); 
}
}

Bookmarkモデル(1:N


class Bookmark extends Model 
{ 
public function user()
{ 
return $this->hasMany('App\User'); 
}
}

それでは実際にEloguentを使って表示してみます。

例)誰がどんなページをブックマークしているか?


//id=1のユーザーを取得
$user = App\User::find(1);

//ブックマークを取得
$bookmarks = $user->bookmarks;

//ユーザー表示
echo "ユーザー名: ".$user->user_name."のブックマーク<BR>";

//ブックマーク表示
foreach($bookmarks as $bookmark)
{
echo $bookmark->page_title."<BR>";
}

//ブックマーク数を表示
echo $bookmarks->count()."数<BR>";

User しか取得していないのに、その下にぶら下がるブックマークを user->bookmarks で取得できるようになります。

今度は逆にブックマークごとにユーザー名を表示してみます。


//ブックマーク一覧取得
$bookmarks = \App\bookmarks::all();

  //ループして表示
  foreach($bookmarks as $bookmark)
  {
      //ユーザー名取得
      echo $bookamrk->user->user_name." ".$bookmark->page_title."<BR>";
  }

ブックマークを取得して、 $bookmark->user->user_name でユーザー名を得ることができます。

POINT!

DBファサードを使ってJoin句でインナージョインすることも可能です。この場合、モデルをいじる必要はありません。

Eloquentの使い方については以上です。

本庄マサノリ

仕事でLaravelを使っています。気づいたことや新しい発見など情報を発信していきます。メールはこちら

 

-基礎知識