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

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

ただいまの
回答率

89.19%

cakephp3 JOINした情報を画面に出力したい

解決済

回答 1

投稿 編集

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

XYZA

score 20

前提・実現したいこと

cakephp3を使用して、区分値マスタの情報を電話番号マスタテーブルJOINさせて区分名を表示させたい
■困っていることその1:whereのIDを画面から取得した$idとしたい(idが取得できているのは確認済み)がうまく取得できない
■困っていることその2:whereのIDをDBに存在する情報(固定値)に変更し取得した場合、画面に表示ができない

発生している問題・エラーメッセージ

■困っていることその1

Error: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound 


SQL Query: 

WHERE (CallNumbers.A_id = :id ...


と表示されているので、うまく代入ができていないと思われます

■困っていることその2
実行後に取得した配列は以下のような形で取得されました

Cake\ORM\ResultSet Object ( 
     [items] => Array ( 
          [0] => App\Model\Entity\CallNumber Object ( 
     [call_number_kbn_nm] => PC 
     [call_number] => 1234567890 
     [[new]] => [[accessible]] => Array ( [*] => 1 ) [[dirty]] => Array ( ) [[original]] => Array ( ) [[virtual]] => Array ( ) [[errors]] => Array ( ) [[invalid]] => Array ( ) [[repository]] => CallNumbers ) ) )


<?= h($results) ?>の場合文字列で

(object)Cake\ORM\ResultSet


と表示され、
<?= h($results ->call_number_kbn_nm) ?>の場合

Notice (8): Undefined property: Cake\ORM\ResultSet::$call_number_kbn_nm


とエラーが表示されます。

該当のソースコード

/*....Controller.php*/
$query = $CallNumber -> find() 
     -> hydrate(true) 
     -> join(['table' => 'kbn_masters', 
               'alias' => 'km', 
               'type' => 'INNER', 
               'conditions' => [
                    'km.kbnid = CallNumbers.call_number_kbn', 
                    'km.subjectid = 2',]
                    ])     
     ->where('CallNumbers.A_id = :id', ['id' => $id])
     -> select([
          "call_number_kbn_nm" => "km.kbn_name", 
          "call_number" => "CallNumbers.call_number"])
          ;

$results = $query -> all();
this -> set('results', $results);
/*view.ctp*/

<?php foreach ($results as $result): ?>

    <tr>
        <th><?= __('電話番号') ?></th>
        <td><?= h($results) ?></td>
        <td><?= h($results ->call_number_kbn_nm) ?></td>
        <td><?= h($results ->call_number) ?></td>
    </tr>
<?php endforeach; ?>

電話番号マスタのcall_number_kbnに対応する区分マスタはsubjectidが2のものとなります。

SQL取得イメージ

select
  call_numbers.A_id
  , kbn_masters.kbn_name
  , call_numbers.call_number 
from
  call_numbers 
  inner join kbn_masters 
    on kbn_masters.subjectid = 2 
    and call_numbers.call_number_kbn = kbn_masters.kbnid 
where
  call_numbers.A_id = /*id*/;

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

cakephp3 phpMyAdmin

cakephp初心者です。
このようなサイトに投稿するのも初めてです。

ご不明点等ございましたら指摘のほどお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

■困っていることその1
これは、Where句による検索条件の設定方法に誤りがあると思います
以下のようにすることで、検索ができることまでを確認しています

->where(['CallNumbers.studio_id' => $id])

■困っていることその2 
これはご自身も書いているように$resultsで取得される検索結果は、配列として格納されており、たとえ検索結果が1件でも、その要素を取り出して処理する必要があります(foreachの部分ですね)
そのため、VIEWで表示する検索結果は、$resultsではなく$resultの要素となります

<?php foreach ($results as $result): ?>

    <tr>
        <th><?= __('電話番号') ?></th>
        <td><?= h($result) ?></td>
        <td><?= h($result ->call_number_kbn_nm) ?></td>
        <td><?= h($result ->call_number) ?></td>
    </tr>
<?php endforeach; ?>


ただし、h($result)は$result自体も配列のため、
{ "id": 2, "call_number_kbn_nm": "kubun_002", "call_number": "03-5555-6666" }
というような表示となります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/23 12:11

    本当にありがとうございました。無事表示できました。

    キャンセル

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

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