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

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

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

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

PHP

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

Q&A

解決済

1回答

10495閲覧

今更ですがormについて教えてください 主にphpフレームワーク

yoppy0066

総合スコア293

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

PHP

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

0グッド

2クリップ

投稿2016/08/16 16:14

主にサーバーサイドの開発はPHPで行っているものです。

フレームワークは何種類か使って経験はあるのですが、私が開発する場合いずれもormを使用しないルールでSQLを直書きする形で実装しています

また、いくつかのプロジェクトを経験したのですがormを使っている案件があまりありません。
使っている案件もあったのですが、そのときの開発者が精通していなかっただけなのかもしれませんが、SQL直接書いたほうがわかりやすいだろって思ってしまいます。

私の知識不足かもしれないのですが複雑なSQLなどはやはりSQLを書くケースもふえてくるのかなと考えると、orm使っている箇所とSQL書いている箇所と混在して。。。と思うとそれなら全部SQLでいいじゃんって思ってしまいます

PHPのフレームワークをいくつか経験してどれも似たようなものだなと思ってしまうのですが、それはormを使っていないからなのでしょうか?
フレームワーク使うならorm使ってなんぼっていう感じなのでしょうか?

まとまりがない質問ですみませんがよろしくお願いします

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

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

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

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

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

raccy

2016/08/16 22:19

どのようなフレームワークを使っていたかとか追記して貰うと、具体性が増し、参考になる回答が集まるかも知れません。
yoppy0066

2016/08/17 03:34

ありがとうございます。以下を使用してきました。 ・cakephp ・codeigniter ・fuelphp ・ethna 基本的にsqlを実行する共通クラスを用意。 dbアクセサ用のクラスをだいたいテーブル単位で作成。 dbアクセサにsqlを記述。sqlを共通dbクラスに渡して実行 という流れでどのFWでも同じような流れとしていました
guest

回答1

0

ベストアンサー

あまり正確な表現ではないかも知れませんが、次のような感じです。

テーブル単位でクラスを作っているとのことですが、ORMはそのクラスを簡単に宣言的に作れる機能です。ORMでは対象のテーブルにこういう型のこういうカラムがあると宣言的に記載します。中には、テーブルを指定するだけでカラムを自動的に認識してくれる物、または、クラス名から自動的にテーブルまで決まる(「設定より規約」の採用)物やもあります。ただそれだけで、簡単なクエリ、例えば、nameがTaroのレコードを検索して、そのクラスのオブジェクトにしたもののリストが取得する、というのがメソッド一つでできます。ソートやリミットなど、単純な物であれば、同様にできます。

ORMの利点は簡単なクエリであれば、メソッド一つや二つで簡単にできると言うことです。そこにSQL文の記載は必要ありません。よく使うようなソート(order by)やリミット(limit)も用意されていますので、実用性は十分です。リレーションについても、関連することが定義してあれば、簡単にjoinして、同時に取得もできます。また宣言的に定義できるというのも利点です。もし、作成途中の仕様変更でカラムが増えた場合、いちいち作っていたら全てのSQL文で色々考えて変更する必要があるかも知れませんが、ORMでは定義部分に一行追加するだけで済む場合もあります。

ただ、欠点もあります。ORMは単純なマッピングしかできません。ある程度複雑なこともできないことも無いのですが、基本的にはテーブルがそのままクラスになる(カラムとプロパティが1対1になる)ように作らないと、あまり良いものにはなりません(リードオンリーで良ければVIEWに対して作るという手段もあります)。また、複雑なSQL文を作るには限界があります。特にSQL文の書き方によってパフォーマンスが異なるぐらい複雑な場合は、ORMではパフォーマンスがかなり悪くなってしまうこともあります。だからといって、そういう場合にORMが全く使えないというわけではありません。多くのORMはSQL文をそのまま渡して、マッピングだけを自動化するようなことができます。パフォーマンスに影響が出るような複雑な場合のみSQL文を使って、単純なクエリ(例えばnameがTaroを検索とか)はORMそのままを使うとしただけでもいいのです。

ORMにはもう一つ利点があります。それは、RDBMSの実装の違いを吸収できる場合があると言うことです。MySQL、PostgreSQL、Oracle、SQLiteなど多くのRDBMSがありますが、型の取り方や使える文法などに差異があります。SQLiteはお手軽に使えるため、開発やテストなどでは有用ですが、本番環境では性能的に使えるような物ではありません。ORMを使えばそのような差異を吸収できるため、開発やテストではSQLiteを使って、本番ではMySQLを使うと言うこともできます。開発効率が良くなるという話は、こういう面もあるからというのもあります。

なお、ORMで気をつけて欲しいのは、SQLが必要なくなるということではないことです。ORMを使う場合は、どのようなSQL文が発行されるかはデバックなどで常に確認する必要があります。複雑な条件にしてしまうと、時には効率が悪いSQL文を発行してしまっているときもありますので、SQL文を直接読ませるように書き直す必要もあります。ただ、単純なクエリがほとんどの場合であれば、開発効率は高くなると思います。

と言うことで、複雑なSQL文がはたして全体のどれだけを占めるのか、それを考えてみてはいかがでしょうか?また、逆に言うと、複雑なSQL文が必要になるようなDB設計になっていないでしょうか?ORMは万能ではありませんし、システムによってあうあわないはあると思っています。ただ、会計処理など複雑な計算が必要になるシステムでない限り、ほとんどのクエリは単純な物になるだろうし、ORMに単純にマッピングできると私は思っています。

投稿2016/08/17 13:19

編集2016/08/17 13:20
raccy

総合スコア21735

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

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

yoppy0066

2016/08/19 06:01

ありがとうございました。参考にさせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問