cakephpのO/Rマッパ
環境: cakephp3
cakephpでは、
リポジトトリやテーブルオブジェクト
そして
エンティティー
と、2つのオブジェクトを使ってデータベースのデータを操作する。
(テーブルオブジェクトCake/ORM/Table(コード読むこと)→ 特定のテーブルに保存されたエンティティーのコレクションへのアクセスを提供する)
(エンティティー → テーブルオブジェクトがオブジェクトのコネクションにアクセスするときに、エンティティーがアプリの各行やドメインオブジェクトを表す)
(例) use Cake/ORM/TableRegistry; // Articleテーブルのインスタンス $article = TableRegistry::get('Article'); $query = $article->find(); foreach($query as $row) { // $rowはArticleのインスタンス echo $row->title; }
なんと、コードを作ったり、設定書いたり、いらない。 データベースからエンティティをロードした時に、 新しい Article クラスのインスタンスが生成される。
- あとがき
Ruby on Railsが採用したActiveRecordというO/Rマッパである。これにより、重複さけられる。
CakePHP3で一新されたORMは「結果が配列からオブジェクトになった」だけではない!!!!!!!
「Eager loading と Lazy loading」
Eager loading →JOINを使って可能な限り、一度のクエリで関連データの取得をするので、扱うデータが大きい。扱うデータが多い場合はクエリが複雑になる場合さえある。特に、コントローラーからORMを使う場合などは基本的にEager Loading。
Lazy loading →JOINを使わずにシンプルなクエリを実行する。CakePHP3ではエンティティクラスからクエリを実行する形にすることで必要な時に後からクエリを実行する事ができるようになった。
O/Rマッピング
- O/Rマッピングとは
JDBC(リレーショナル・データベース(および、ほとんどすべての表形式のデータ)にアクセスするための、標準Java API)を利用した開発方法でデータベースにアクセスする際の問題点。
を解決した。
O/Rマッピングとは、「オブジェクト」と「リレーショナルデータベース」をマッピング(対応付け)すること。 実装時のデータベース操作にかかわる煩雑な作業を軽減し、「インピーダンスミスマッチ」を解決 。
インピーダンスミスマッチ??????
javaのようなオブジェクト指向の言語で、リレーショナルデータベースを扱う際は、マッピング作業が大変。
これは思想が違うから。この問題のこと。
オブジェクト指向→ プログラムをオブジェクトとして設計する。現実世界のモデルに即したものとしてデータモデルに定義。 (部長のクラス、一般社員のクラス、社長のクラスというふうに捉える。この考えでデータベー分けると、カラムがかぶる)
データベース→正規化で最適なモデルを定義。現実世界のモデルがどうなっているかではなく、数学的世界の事情に基づく。
表形式のデータをオブジェクト形式のデータに対応付けるマッピングコードを作成しよう!!!
2. O/Rマッピングの基本的な流れ
① 基本的な機能
コネクション管理機能(データベースとの接続やコネクションプーリング管理)
自動マッピング機能(XMLファイルなどの外部ファイルにオブジェクトの属性名とテーブルの列名に関するマッピング定義を設定することによって自動的にマッピング処理をする)
マッピングファイル、DTO、DAO(プログラムコードを用いて Microsoft Jetエンジン (Accessデータベースとも言われています)に直接接続し、これらオブジェクトを作成し、修正、削除するための オブジェクトモデル )の自動生成機能
接続情報の管理機能
キャッシュ機能
②処理の流れ
1. データベースの接続情報をXMLファイルに定義(データベース設定ファイル)
2. クラスのフィールドとテーブルカラムの対応付けをXMLファイルに定義(マッピング・ファイル)
3. O/Rマッピングツールがデータベース設定ファイルとマッピングファイルを読み込んで自動的にマッピング処理を行う
4. アプリケーションからO/RマッピングツールのAPIを介してデータベースへアクセス
③メリット
④種類
いろいろ。SQL文を明示的に記述する必要があるタイプと、SQL文を記述する必要がないタイプ(つまりsql自動生成)がある。
(PHP)親クラスのメソッドをオーバーライドする
継承した子クラスで、親クラスで定義されたメソッドの再定義をする。
class Parentclass { public function speak() { return "I'm Parent!"; } } class Childclass extends Parentclass { public function speak(){ return "I'm Child!" ; } } //出力確認 $speak = new Parentclass() ; echo $speak -> speak() ; //I'm Parent! $speak = new Childclass() ; echo $speak -> speak() ; //I'm Child!
子クラスで「parent::親クラスのメソッド名()」とすることで、親クラスのメソッドを呼び出すことが可能!これで親クラスで何か変更があってもそのまま子クラスにも反映される!親クラスの機能を「生かし」つつ、親クラスの機能に少し変更を加えられる!
継承されているクラスが増えると必要性が増す!
例えば、親クラスは、メソッドA・B・Cをよびだすメインのメソッドを実装していたとする。
この時、子クラスはメソッドBだけをオーバーライドして修正するだけで、
メインのメソッド全体を書き直さなくてもよい、というメリットがある。
(cakephp) モデルの中で他のモデルを使う
App::import''
→ ファイルとクラス名が一致しないような古いタイプのライブラリやスクリプトを利用する場合に使う。
①modelの呼び込み
②クラスのインスタンス化
③実際に使う
①App::import('Model', 'Hoge');
②$hoge_model = new Hoge();
③$this->$hoge_model->find(‘all’,$options);
*Controllerから複数のModelを呼び出す場合は
public $uses = array(‘Model1’,’Model2’);
ちなみに、ロードするライブラリがオートロードの規約に従っているかどうかで使い分ける。
規約に従っている → App::uses()を使う。 規約に従っていない → App::import()を使う。
uml
1. umlとは?
モデルの表記法を統一したもの
※モデル→オブジェクト指向によるシステム開発では、さまざまな視点からオブジェクトをとらえる。オブジェクト群がどのような構造を持っているのかが見えづらいので図(ダイアグラム)を使って表す。この図のこと。
2. メリット
オブジェクト指向を使ったシステム開発において、分析から設計、実装まで終始一貫して使われる技術であること
→分析と設計のどの部分が対応するのか、設計と実装のどの部分が対応するのかといったことが分かりやすい。
3. umlのダイアグラム
全部で9種類。
(例)
[分析]
- システムのサービスを表現するための「ユースケース図」
- どんな概念があるのかを把握するための「クラス図」
[設計]
- システムの構造を表すための「クラス図」
- オブジェクトの振る舞いを表すための「シーケンス図(コラボレーション図)」
[実装]
4. ユースケース図とは
「システムが外から見てどんなふうに動作し、反応するかという振る舞いを図で表したもの」
システムがどのように機能すべきか(ユースケース)、およびその外部環境(アクター:人間、ハードウェア、外部システムなど)を表す。
エンドユーザの視点からシステムについて見ることができる。
システムの外部と内部との境界をはっきりさせる。
5. シーケンス図とは
「オブジェクトの間でやりとりされるメッセージの明示的な順序を表現しやすい図」
https://www.ogis-ri.co.jp/otc/hiroba/UMLTutorial/analysis/do_work/dowork1_1.html
(cakephp) 複数のデータベースを扱う方法と切り替え
データベースの複数定義
app/config/database.php
class DATABASE__CONFIG { public $default = array( 'datasource' => 'Database/mysql', 'persistent' => false, 'host' => '123.123.456.789', 'login' => 'hoge.com', 'password' => 'hoge2012', 'database' => 'hogehoge', 'prefix' => '', 'encoding' => 'utf8', ); //追加した別のデータベース public $hoge = array( 'datasorce' => 'Database/mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'hoge', 'password' => 'hoge2012', 'database' => 'hoge', 'prefix' => '', 'encoding' => 'utf8', ); }
各データベースの呼び出し
1. controllersにDBの切り替えを記述
普段は$defaultを扱い、たまに別のデータベースを扱うならコントローラーに書く
$this->Model->useDbConfig = $dbname//DB変更 $this->Model->useDbConfig = $dbname//DBを元に戻す