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マッピング

  1. O/Rマッピングとは

JDBC(リレーショナル・データベース(および、ほとんどすべての表形式のデータ)にアクセスするための、標準Java API)を利用した開発方法でデータベースにアクセスする際の問題点。

SQL文などを直接ソースコードに埋め込む

を解決した。

O/Rマッピングとは、「オブジェクト」と「リレーショナルデータベース」をマッピング(対応付け)すること。 実装時のデータベース操作にかかわる煩雑な作業を軽減し、「インピーダンスミスマッチ」を解決 。

インピーダンスミスマッチ??????

javaのようなオブジェクト指向の言語で、リレーショナルデータベースを扱う際は、マッピング作業が大変。
これは思想が違うから。この問題のこと。

f:id:k_ootake:20151126000720p:plain

  • オブジェクト指向→ プログラムをオブジェクトとして設計する。現実世界のモデルに即したものとしてデータモデルに定義。 (部長のクラス、一般社員のクラス、社長のクラスというふうに捉える。この考えでデータベー分けると、カラムがかぶる)

  • データベース→正規化で最適なモデルを定義。現実世界のモデルがどうなっているかではなく、数学的世界の事情に基づく。

表形式のデータをオブジェクト形式のデータに対応付けるマッピングコードを作成しよう!!!

2. O/Rマッピングの基本的な流れ

① 基本的な機能

  • コネクション管理機能(データベースとの接続やコネクションプーリング管理)

  • 自動マッピング機能(XMLファイルなどの外部ファイルにオブジェクトの属性名とテーブルの列名に関するマッピング定義を設定することによって自動的にマッピング処理をする)

  • マッピングファイル、DTO、DAO(プログラムコードを用いて Microsoft Jetエンジン (Accessデータベースとも言われています)に直接接続し、これらオブジェクトを作成し、修正、削除するための オブジェクトモデル )の自動生成機能

  • 接続情報の管理機能

  • キャッシュ機能

②処理の流れ
1. データベースの接続情報をXMLファイルに定義(データベース設定ファイル)
2. クラスのフィールドとテーブルカラムの対応付けをXMLファイルに定義(マッピング・ファイル)
3. O/Rマッピングツールがデータベース設定ファイルとマッピングファイルを読み込んで自動的にマッピング処理を行う
4. アプリケーションからO/RマッピングツールAPIを介してデータベースへアクセス

③メリット

  • 変更に強い

  • インピーダンスミスマッチを解決

  • 自動生成による開発効率の向上

  • データベースの差(sql方言の差)の吸収

④種類

いろいろ。SQL文を明示的に記述する必要があるタイプと、SQL文を記述する必要がないタイプ(つまりsql自動生成)がある。

http://www.atmarkit.co.jp/ait/articles/0106/26/news001.html

https://thinkit.co.jp/free/article/0606/13/1/

Webブラウザ

Webブラウザとは、
「Webサーバからデータを取得して閲覧するためのもの」

1. シェア

1位 Internet Explorer 57.38%
2位 Chrome 24.69%
3位 Firefox 11.60%
4位 Safari 4.84%
5位 Opera 1.09%

2. 各々の自己紹介

Internet Explorer

  • 世界シェアNo.1

  • Windowsが標準、Macでは使えない

  • バージョン9以前は、動作が遅く、HTMLの読み込みが独自方式で崩れてしまうバグも多かったが、現在は解消(最新は11)

Chrome

Firefox

Safari

  • Macの標準ブラウザ

  • IEと比べてフォントが美しく表示されるらしい

Opera

  • ノルウェーのソフト開発会社、オペラ・ソフトウェアが開発

  • 軽いブラウザとして人気だった

(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. ユースケース図とは
「システムが外から見てどんなふうに動作し、反応するかという振る舞いを図で表したもの」

f:id:k_ootake:20151125231124p:plain

  • システムがどのように機能すべきか(ユースケース)、およびその外部環境(アクター:人間、ハードウェア、外部システムなど)を表す。

  • エンドユーザの視点からシステムについて見ることができる。

  • システムの外部と内部との境界をはっきりさせる。

5. シーケンス図とは
「オブジェクトの間でやりとりされるメッセージの明示的な順序を表現しやすい図」

f:id:k_ootake:20151125232055p:plain

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を元に戻す