質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

7618閲覧

cakephp3での複数テーブル・カラムからのselect

tomatokechappu3

総合スコア11

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2017/02/12 10:28

###前提・実現したいこと
cakephp3にて以下のレコードを取得したいのですが、取得方法がわからず困っています。初歩的な質問かもしれませんがご教授願います。

Playersテーブル・Gamesテーブルから任意のレコードを取得したいです。

①Players.user_id = 1のレコードを全て取得
②Games.player_id_1, Games.player_id_2またはGames.player_id_3が、①で取得したレコードのidカラムと一致する全レコードを取得。

②を実現するための方法がわかりません。
また、②が実現できれば①の過程にこだわりわありません。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turbgraphics200

2017/02/12 11:07

"①で取得したレコードのidカラム"と書かれていますが、CakePHPはデフォルトでidカラムをキー列(自動裁判)とするような感じだったと思いますが、idカラムで間違いないでしょうか。
guest

回答1

0

ベストアンサー

やり方は色々あると思いますが、なるべくアソシエーションを使って、テーブル構造に沿った実装にするなら以下のような感じでしょうか

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を持たせて関係を定義した方がより柔軟かもしれませんね。

投稿2017/02/13 01:53

編集2017/02/13 03:51
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomatokechappu3

2017/02/14 13:13

icchiiさん、ご回答ありがとうございます。 また、早々にレスポンスいただいたturbgraphics200さん、回答ができないママとなり申し訳ございません。 icchiiさんの仰るように、まさにテーブル構造を見直して再構築して色々と試しているところでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問