2024.07.27
【Phalcon】リレーションを使う

UnsplashNattu Adnanが撮影した写真

はじめに

Phalconでの多対多のリレーションの使い方を簡単にまとめた記事です。

環境

OS:Windows11 Home / WSL(Ubuntu20.04)
php:v7.4.33
phalcon:4.0.6
Phalcon DevTools:v4.2.0
DB:mysql v8.0.34

テーブル作成:使用するテーブル(モデル)は3つ

以降では、ある会社での「社員 ⇔ 社内クラブ」の多対多の関係を例にしており、テーブル(モデル)は以下3つを作成します。

■User :社員テーブル
  u_user_idカラム :serial primary
  u_nameカラム  :varchar(20) not null
  u_passwordカラム:varchar(100) not null

■UserClub:中間テーブル
  uc_id :serial primary
  uc_user_id:varchar(20) not null
  uc_club_id:varchar(20) not null

■Club  :クラブテーブル
  c_club_id :serial primary
  c_name :varchar(20) not null

モデルのコーディング

■Userモデル

<?php
use Phalcon\Mvc\Model;

 class User extends Model{
    public $u_user_id;
    public $u_name;
    public $u_password;
 
    public function initialize(){
        $this->setSchema("first_phalcon");
        $this->setSource("user");
 
        //リレーション① User ⇔ UserClub ⇔ Club
        $this->hasManyToMany(
            'u_user_id',  //自分の主キー
            UserClub::class,
            'uc_user_id', //中間テーブルのカラム
            'uc_club_id', //中間テーブルのカラム
            Club::class,
            'c_club_id',  //相手の主キー
            [
                'reusable' => true,
                'alias' => 'u_clubs',
            ]      ↑リレーションを
        );        呼び出すワード
  
  //リレーション② User ⇔ UserClub
        $this->hasMany(
            'u_user_id',  //自分の主キー
            UserClub::class,
            'uc_user_id', //相手の主キー
            [
                'reusable' => true,
                'alias' => 'u_userclubs'
            ]
        );
    }
 //以下省略~~
}

■UserClubモデル

<?php
use Phalcon\Mvc\Model;

 class UserClub extends Model{
    public $uc_id;
    public $uc_user_id;
    public $uc_club_id;
 
    public function initialize(){
        $this->setSchema("first_phalcon");
        $this->setSource("user_club");
 
        //リレーション① UserClub ⇔ User
        $this->belongsTo(
            'uc_user_id', //自分の主キー
            User::class,
            'u_user_id', //相手の主キー
            [
                'reusable' => true,
                'alias' => 'uc_user'
            ]
        );
 
  //リレーション② UserClub ⇔ Club
        $this->belongsTo(
            'uc_club_id',
            Club::class,
            'c_club_id',
            [
                'reusable' => true,
                'alias' => 'uc_club'
            ]
        );
    }
 //以下省略~~
}

■Clubモデル

<?php
use Phalcon\Mvc\Model;
 
class Club extends Model{
    public $c_club_id;
    public $c_name;
 
 
    public function initialize(){
        $this->setSchema("first_phalcon");
        $this->setSource("club");
 
  //リレーション① Club ⇔ UserClub ⇔ User
        $this->hasManyToMany(
            'c_club_id',
            UserClub::class,
            'uc_club_id',
            'uc_user_id',
            User::class,
            'u_user_id',
            [
                'reusable' => true,
                'alias' => 'c_users',
            ]
        );
 
        //リレーション② Club ⇔ UserClub
        $this->hasMany(
            'c_club_id',
            UserClub::class,
            'uc_club_id',
            [
                'reusable' => true,
                'alias' => 'uc_clubs'
            ]
        );
 }
 //以下省略~~
}

 

モデルのコーディングが完了したら、リレーションを使う準備は完了です。

続いて使い方のご紹介です。

コントローラの記述

■対象ファイル:/app/Controllers/UserController.php

public function indexAction(){

  //通常通りモデルでレコードを取得しViewに渡す。
  $users = User::find();

  $this->view->users = $users;
}

ビューに表示する

<?php
  foreach($users as $user){
    echo "<p>{$user->u_name}が所属しているクラブ:";

    //Userモデル「リレーション① User⇔UserClub⇔Club」で定義したalias「u_clubs」を使いClubクラスを呼び出す。

    foreach($user->u_clubs as $club){
     echo $club->c_name, "、";        
    }
    echo "</p>";
 }
?>

 

表示はとても簡素ですが、以上の手順で多対多のリレーションを使用できます。