質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

7886閲覧

クエリビルダとEloquentの違い

kiritan

総合スコア30

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/02/10 11:48

ララベルの勉強をはじめたときにEloquentで書けることはクエリビルダを使わない方が良いみたいなことをネットの記事で読んだのですがEloquentとクエリビルダのメリットデメリットがわかりません。

どこかの記事で読んだ感じでは取得したデータ構造がstdClassと連想配列で返ってくると思っていたのですがどちらも連想配列で返ってきました。

$r = Test::get(); var_dump($r); $r2= DB::table('test')->get(); var_dump($r2);

update()とsave()ではupdated_atが更新される/されないなどという違いがわかりましたがメリットデメリットというほどの話ではない気がします。

DB::rawはあまり使わないほうが良いというのはなんとなくわかるのですが。。。
DBの違いやバージョンの違いは例えばupdate()とsave()のどちらも吸収してくれるのですよね?
Eloquentを使わないといけない理由を教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どこかの記事で読んだ感じでは取得したデータ構造がstdClassと連想配列で返ってくると思っていたのですがどちらも連想配列で返ってきました。

少なくとも自分の知る Laravel 5.5 では、前者はモデルクラスのインスタンス、後者はstdClassのインスタンスで返ってきます。連想配列で返ってくることはありません。

パッと見で思い込んでいるだけで、var_dumpの結果が実は連想配列じゃなかったりすることはありませんか?できれば結果までコピペで提示していただけると確実です。

Eloquentを使わないといけない理由を教えてください。

【メリット】

  • リレーションを定義できる
  • イベントハンドラを定義できる
  • JSONレスポンスの生成、およびそのための加工が宣言的にできる
  • ルートモデルバインディングを利用できる
  • 再利用性が高い

【デメリット】

  • (Many to Many 系以外の) リレーションでJOINを使ってくれないので最速のパフォーマンスは出ない
  • クエリビルダに比べると学習コストが高い

投稿2018/02/10 16:13

編集2018/02/10 16:16
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiritan

2018/02/10 23:18

回答誠にありがとうございます。 Laravel 5.5 を使っています。 クエリビルダ、Eloquentもどちらもログに出してマージツールでマージしましたが完全に一致しました。 内容が載せられないのでカラム名と値を置換しましたがどちらも以下形式で出力されました。 どこかで変換する処理がはいっているとか。。。? [{"id":106, "created_at":"2018-02-09 12:35:10", "updated_at":"2018-02-09 12:35:10", "test_id":7, "test2_id":1, "name":"green", "flg":0}, {"id":107, "created_at":"2018-02-09 12:35:10", "updated_at":"2018-02-09 12:35:10", "test_id":3, "test2_id":2, "name":"red", "flg":0 }] 今作っているものが、バッチなので、あまり利便性がわからないのかもしれないです。 mpywさんの言ってることがあまりわからないのですが挙げていただいた内容を元に勉強してみます。
mpyw

2018/02/11 05:07

>> クエリビルダ、Eloquentもどちらもログに出して これJSON変換された後ですよね。明らかにvar_dumpが出力する素の形式ではないです。ログに出すときにvar_dump使ってなくないですか?
mpyw

2018/02/11 05:09

\Log::debug() などを行うと勝手に __toString() などの変換がかかるので、 ob_start(); var_dump(Test::get()); \Log::debug(ob_get_clean()); の形式でダンプしてください。
mpyw

2018/02/11 05:11 編集

見た感じ、ちゃんとモデルオブジェクト(Illuminate\Database\Eloquent\Model)のコレクション(Illuminate\Database\Eloquent\Collection)が返ってきているように見えます。「連想配列」だと思っているのは思い込みだと思います。
mpyw

2018/02/11 05:13

assert($r instanceof \Illuminate\Database\Eloquent\Collection); assert($r[0] instanceof \Illuminate\Database\Eloquent\Model); ↑のアサーションは通るはず
kiritan

2018/02/11 19:31

mpyw様の言う通りlogで確認していました。var_dumpで改めて確認すると (Illuminate\Database\Eloquent\Collection)とstdClassで返ってくることが確認できました。 ありがとうございます。質問については閉めますが、引き続き挙げていただいた項目を元にEloquentメリットについて調べてみます。本当にご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問