UnsplashのNattu 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つを作成します。
■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>";
}
?>
表示はとても簡素ですが、以上の手順で多対多のリレーションを使用できます。