phalcon あれやこれや2 phalcon

コントローラから もでるつかって sql実行
TestController.php
public function test()
{
$region = Regions::findFirst(1);
$prefectures = $region->prefectures;
}


PhalconでJOINを使いたい時にはModelのinitialize()内で、hasOne hasMany belongsToなどを使います。
model/Prefectures.php
public function initialize()
{
// 地方を親に持つのでbelongsTo
$this->belongsTo( region_id Regions id );
// 子に市区町村を持つのでhasMany
$this->hasMany( id Towns prefecture_id );
// 都道府県の詳細は1対1なのでhasOne
$this->hasOne( id PrefectureDetails prefecture_id );
}



Phalconでは、リレーションはモデルのinitialize()メソッドの中で定義する必要があります。
リレーションを定義するメソッドには4種類あり、
★★いずれも「自分自身のフィールド名(≒カラム名)」「参照するモデル名」「参照するフィールド名」の3つのパラメータをとります。
------------------------------------
メソッド 状態
hasMany 1対多
hasOne 1対1
belongsTo 多対1
hasManyToNany 多対多
------------------------------------
以下のようなテーブルの関係を考えてみます。
CREATE TABLE `robots` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT
`name` varchar(70) NOT NULL
`type` varchar(32) NOT NULL
`year` int(11) NOT NULL
PRIMARY KEY (`id`)
);
CREATE TABLE `robots_parts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT
`robots_id` int(10) NOT NULL
`parts_id` int(10) NOT NULL
`created_at` DATE NOT NULL
PRIMARY KEY (`id`)
KEY `robots_id` (`robots_id`)
KEY `parts_id` (`parts_id`)
);
CREATE TABLE `parts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT
`name` varchar(70) NOT NULL
PRIMARY KEY (`id`)
);
1つのRobotsは、1つ以上のRobotsPartsをもつ
1つのPartsは、1つ以上のRobotsPartsをもつ
1つ以上のRobotsPartsが、Robotsに属する
1つ以上のRobotsPartsが、Partsに属する
RobotsとPartsは、RobotsPartsを介して、多対多の関係になっている(RobotsPartsは中間テーブル)
ER:robots-robots_parts-parts
それぞれのモデルは以下のように実装できます(Phalcon DevToolsはv1.3.1現在、リレーションの自動生成には対応していません。リレーションの記述は手動で行う必要があります)。
<?php
class Robots extends &yen;Phalcon&yen;Mvc&yen;Model
&#123;
public &#36;id;
public &#36;name;
public function initialize()
&#123;
&#36;this->hasMany( id RobotsParts robots_id );
&#125;
&#125;
<?php
class Parts extends &yen;Phalcon&yen;Mvc&yen;Model
&#123;
public &#36;id;
public &#36;name;
public function initialize()
&#123;
&#36;this->hasMany( id RobotsParts parts_id );
&#125;
&#125;
<?php
class RobotsParts extends &yen;Phalcon&yen;Mvc&yen;Model
&#123;
public &#36;id;
public &#36;robots_id;
public &#36;parts_id;
public function initialize()
&#123;
&#36;this->belongsTo( robots_id Robots id );
&#36;this->belongsTo( parts_id Parts id );
&#125;
&#125;
リレーション定義メソッドの第1引数には、
★★自分自身のフィールド名、第2引数には参照するモデル名、第3引数には参照するモデルのフィールド名を渡します。
複数のフィールドのリレーションを指定したい場合、配列を使うこともできます。
3つのモデルからなる多対多の関係を単一のメソッドで記述すると、以下のようになります。
<?php
class Robots extends &yen;Phalcon&yen;Mvc&yen;Model
&#123;
public &#36;id;
public &#36;name;
public function initialize()
&#123;
&#36;this->hasManyToMany(
id
RobotsParts
robots_id parts_id
Parts
id
);
&#125;
&#125;
リレーションを活用する
モデルの関係が明示的に定義されると、関連するレコードを簡単に一括取得できます。
<?php
&#36;robot = Robots::findFirst(2);
foreach (&#36;robot->robotsParts as &#36;robotPart) &#123;
echo &#36;robotPart->parts->name &yen;n ;
&#125;
Phalconは、関連するモデルへのデータの保存・取得にマジックメソッド(__set/__get/__call)を用います。
リレーションと同じ名前のプロパティにアクセスすると、関連するレコードが自動で取得されます。
<?php
&#36;robot = Robots::findFirst();
&#36;robotsParts = &#36;robot->robotsParts; // RobotsPartsの関連レコード
getterもマジックメソッドで実装されています(明示的な定義が不要なgetter:マジックゲッター)。
<?php
&#36;robot = Robots::findFirst();
&#36;robotsParts = &#36;robot->getRobotsParts(); // RobotsPartsの関連レコード
&#36;robotsParts = &#36;robot->getRobotsParts(array( limit => 5)); // パラメータを渡す

★★Phalcon&yen;Mvc&yen;Modelは、「get」が頭についているメソッドの呼び出しがされると、
findFirst()又はfind()の結果を返します。以下の例では、マジックゲッターを使った場合と使わない場合とを比較しています。