やり方は色々あると思いますが、なるべくアソシエーションを使って、テーブル構造に沿った実装にするなら以下のような感じでしょうか
Model/Table/GamesTable.php
※GamesTableにそれぞれのplayer_idをPlayersTableとbelongsToで紐付ける
php
1<?php
2namespace App\Model\Table;
3
4use Cake\ORM\Table;
5
6class GamesTable extends Table {
7
8 public function initialize(array $config) {
9 $this->belongsTo('Player1', [
10 'className' => 'Players',
11 'foreignKey' => 'player_id_1',
12 ]);
13 $this->belongsTo('Player2', [
14 'className' => 'Players',
15 'foreignKey' => 'player_id_2',
16 ]);
17 $this->belongsTo('Player3', [
18 'className' => 'Players',
19 'foreignKey' => 'player_id_3',
20 ]);
21 }
22
23}
controller側
Gamesをfindして、各Playerのuser_idをOR検索する
php
1 $this->loadModel('Games');
2 $user_id = 1;
3 $games = $this->Games->find()->contain(['Player1', 'Player2', 'Player3'])
4 ->where(['OR' => [
5 ['Player1.user_id' => $user_id],
6 ['Player2.user_id' => $user_id],
7 ['Player3.user_id' => $user_id],
8 ]]);
9 $this->set(compact('games'));
余談ですが、テーブル構造を変更できるなら、
Gamesにplayer_idを持たせないで、game_playersという中間テーブルにgame_idとplayer_idを持たせて関係を定義した方がより柔軟かもしれませんね。