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

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

ただいまの
回答率

89.24%

cakephp3 リレーションのないテーブル情報の取得に関して

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,509

XYZA

score 20

前提・実現したいこと

cakephp3を使用しています。
リレーションのないテーブルの情報も一括で取得するスマートな方法があれば教えてください。
また、index、viewともに同様の情報を取得したいと思っています。

SQL取得イメージ

select
  AA.*
  , km_A.kbn_name
  , km_B.kbn_name 
from
  AA 
  left outer join kbn_master km_A
    on km_A.subject_id = 3 
    and km_A.kbn_id = A.A_kbn
  left outer join kbn_master km_B
    on km_B.subject_id = 4 
    and km_B.kbn_id = A.B_kbn
  where AA.id = /*id*/ --viewの場合のみWhereを使用; 

補足情報(言語/FW/ツール等のバージョンなど)

cakephp3 
FriendsOfCake/searchプラグインを使用中

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

そういう場合、自分は実行したいSQLを直接指定して実行しています
以下のようなカスタマイズした検索メソッドをModel側に追加して、コントローラーからそのメソッドを呼び出して検索結果を取得します

class CallNumbersTable extends Table
{
    /**
     * カスタム検索
     * @param $id
     */
    public function custom_find($id = null)
    {
        $SQL_QUERY = <<<SQL_ALL
select
  studio.*,
  km_studio.kbn_name,
  km_elevator.kbn_name,
from
  studio
  left outer join kbn_master km_studio
    on km_studio.subject_id = 3  and km_studio.kbn_id = studio.studio_kbn
  left outer join kbn_master km_elevator
    on km_elevator.subject_id = 4  and km_elevator.kbn_id = studio.elevator_kbn
SQL_ALL;

        $sql_str = $SQL_QUERY;

        if ($id != null) {
            $sql_str .= " where studio.id = :ID"; // パラメータがある場合は検索条件を追加
        }
        $params = array('ID' => $id);

        $result = $this->query($sql_str, $params);

        return $result;
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/25 14:17 編集

    Parse error: syntax error, unexpected end of file in C:\xampp\htdocs\workspase\aaa\src\Model\Table\StudiosTable.php on line 204

    残念ながらsyntax errorが発生しました。
    場所は一番最後の}の後で詳細は
    class CallNumbersTable extends Table
    {
    public function custom_find($id = null)



    return $result;
    }
    } ←ココが204行目


    余計なスペース等は入れていません。
    また追加したpublicを削除するとエラーが消えます。

    キャンセル

  • 2016/06/28 14:37

    連絡が遅れて、申しわけありません

    ご指摘の問題ですが、この部分をインデントしていませんか?

    ---------- ここから --------------------------------------------------------------------
    SQL_ALL;
    ---------- ここまで --------------------------------------------------------------------
    この部分は、ヒアドキュメントという構文で、終端は行の最初のカラムからラベル文字が開始している(スペース、Tabは入れてはいけません)必要があります
    自分の環境でも、終端をインデントすることで、syntax errorが発生することは確認していますので、コードの確認をお願いします

    ヒアドキュメント構文については、以下を参照してください
    http://php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc

    キャンセル

  • 2016/06/28 17:08

    ご回答ありがとうございました。

    インデントしてました。。。。
    ヒアドキュメント構文勉強します。

    検証がまだなので、ベストアンサーは少々お待ちください。

    キャンセル

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

  • ただいまの回答率 89.24%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる