phalcon あれやこれや2

2016.01.18 Monday 00:00
0
    コントローラから もでるつかって 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現在、リレーションの自動生成には対応していません。リレーションの記述は手動で行う必要があります)。
    class Robots extends ¥Phalcon¥Mvc¥Model
    {
    public $id;
    public $name;
    public function initialize()
    {
    $this->hasMany("id", "RobotsParts", "robots_id");
    }
    }
    class Parts extends ¥Phalcon¥Mvc¥Model
    {
    public $id;
    public $name;
    public function initialize()
    {
    $this->hasMany("id", "RobotsParts", "parts_id");
    }
    }
    class RobotsParts extends ¥Phalcon¥Mvc¥Model
    {
    public $id;
    public $robots_id;
    public $parts_id;
    public function initialize()
    {
    $this->belongsTo("robots_id", "Robots", "id");
    $this->belongsTo("parts_id", "Parts", "id");
    }
    }
    リレーション定義メソッドの第1引数には、
    ★★自分自身のフィールド名、第2引数には参照するモデル名、第3引数には参照するモデルのフィールド名を渡します。
    複数のフィールドのリレーションを指定したい場合、配列を使うこともできます。
    3つのモデルからなる多対多の関係を単一のメソッドで記述すると、以下のようになります。
    class Robots extends ¥Phalcon¥Mvc¥Model
    {
    public $id;
    public $name;
    public function initialize()
    {
    $this->hasManyToMany(
    "id",
    "RobotsParts",
    "robots_id", "parts_id",
    "Parts",
    "id"
    );
    }
    }
    リレーションを活用する
    モデルの関係が明示的に定義されると、関連するレコードを簡単に一括取得できます。
    $robot = Robots::findFirst(2);
    foreach ($robot->robotsParts as $robotPart) {
    echo $robotPart->parts->name, "¥n";
    }
    Phalconは、関連するモデルへのデータの保存・取得にマジックメソッド(__set/__get/__call)を用います。
    リレーションと同じ名前のプロパティにアクセスすると、関連するレコードが自動で取得されます。
    $robot = Robots::findFirst();
    $robotsParts = $robot->robotsParts; // RobotsPartsの関連レコード
    getterもマジックメソッドで実装されています(明示的な定義が不要なgetter:マジックゲッター)。
    $robot = Robots::findFirst();
    $robotsParts = $robot->getRobotsParts(); // RobotsPartsの関連レコード
    $robotsParts = $robot->getRobotsParts(array('limit' => 5)); // パラメータを渡す

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

    スポンサーサイト

    2019.09.17 Tuesday 00:00
    0
      category:- | by:スポンサードリンク | - | - | -
      Comment








         
      Trackback
      この記事のトラックバックURL

      ad
      Calender
        12345
      6789101112
      13141516171819
      20212223242526
      2728293031  
      << October 2019 >>
      Selected entry
      PR
      Category
      Archives
      Recent comment
      • パス指定 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated ¥xXX escape
        久米隆文
      • 円マークが自動変換されてる
        aaaaaa
      • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
        66hills
      • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
        ssd
      • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
        max
      • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
        DOM
      • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
        DOM
      • コンピュータ業界の根本的な変化
        cloud
      • コンピュータ業界の根本的な変化
        Dellの仮想化
      • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
        えちごや
      Recent trackback
      • スマートフォンの法人活用例
        無線LANネットのブログ
      • Yahoo!オークションからのアフィリエイト収入が一気に70%減になってしまい涙目になってる話
        特選情報
      Recommend
      Link
      Profile
      Search
      Others
      Mobile
      qrcode
      Powered
      無料ブログ作成サービス JUGEM