2011-07-12 7 views
1

あなたが複雑なクエリを手伝ってくれるかどうかは疑問でした。
私は3つのテーブルを持っています。CakePHPの複雑なクエリ

ユーザー、ジョブ、コメント。

ジョブはユーザに割り当てられますが、どのユーザもジョブにコメントを付けることができます。
現時点では、伝統的な方法でベーキングした後、View Jobビューの下部に関連するコメントが表示されます。しかし、Commentsテーブルには数字user_idが表示されていますが、これは前述のuser_idと一致する「username」を表示したいと考えています。 View Jobビューで

、私は、それぞれのキーを使用して、この配列を持っている:

$job; 
$job['Users']; 
$job['Comments']; 
$job['Job']; 

そして、ここでは$jobアレイの私のデバッグ出力です。

Array 
(
    [Job] => Array 
     (
      [id] => 1 
      [user_id] => 1 
      [title] => New Job 
      [body] => adsljbfalwsjbflkjb 
      [deadline] => 2011-07-15 
      [completed] => 0 
     ) 

    [User] => Array 
     (
      [id] => 1 
      [username] => dan 
      [password] => 2fd27a6319ef3faf9ed55b59830d786b5ed890be 
     ) 

    [Comment] => Array 
     (
      [0] => Array 
       (
        [id] => 3 
        [job_id] => 1 
        [user_id] => 2 
        [hours] => 6 
        [body] => Comment from Phil 
        [date] => 2011-07-12 
       ) 

      [1] => Array 
       (
        [id] => 2 
        [job_id] => 1 
        [user_id] => 1 
        [hours] => 2 
        [body] => This is a Comment from the 9th 
        [date] => 2011-07-09 
       ) 

     ) 

) 

私はuser_idではなくusernameを表示するために何かを行うことができますか?モデルを修正しますか?コントローラー?
私はCakePHPの新機能ですが、基本は把握していますが、このような複雑なクエリには苦労しています。あなたの助けのための

<div class="related"> 
    <h3><?php __('Comments'); ?></h3> 
    <?php if (!empty($job['Comment'])): ?> 
     <table cellpadding = "0" cellspacing = "0"> 
      <tr> 
       <th><?php __('User'); ?></th> 
       <th><?php __('Date'); ?></th> 
       <th><?php __('Hours'); ?></th> 
       <th><?php __('Body'); ?></th> 
       <th class="actions"><?php __('Actions'); ?></th> 
      </tr> 
      <?php 
      $i = 0; 
      foreach ($job['Comment'] as $comment): 
       $class = null; 
       if ($i++ % 2 == 0) { 
        $class = ' class="altrow"'; 
       } 
       ?> 
       <tr<?php echo $class; ?>> 
        <td><?php echo $comment['user_id']; ?></td> // NEEDS TO BE USERNAME NOT USER ID 
        <td><?php echo $comment['date']; ?></td> 
        <td><?php echo $comment['hours']; ?></td> 
        <td><?php echo $comment['body']; ?></td>     
        <td class="actions"> 
         <?php echo $this->Html->link(__('View', true), array('controller' => 'comments', 'action' => 'view', $comment['id'])); ?> 
         <?php echo $this->Html->link(__('Edit', true), array('controller' => 'comments', 'action' => 'edit', $comment['id'])); ?> 
         <?php echo $this->Html->link(__('Delete', true), array('controller' => 'comments', 'action' => 'delete', $comment['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $comment['id'])); ?> 
        </td> 
       </tr> 
      <?php endforeach; ?>+ 
     </table> 
    <?php endif; ?> 

</div> 

ありがとう:

は、ここで私が変更したい私のビューファイルです!

+0

あなたのビューでは、 'debug($ job)'とあなたの持っているものを投稿します。私はそれが既にそこにあると賭けている。 –

+0

@ Jason McCreary質問を出力に更新しました。 –

+0

コントローラ/モデルコードを見る必要がありますが、これは可能です。あなたは '$ this-> Model-> recursive'を変更していますか?これは、関連作業が追加作業なしにどのくらい深く影響を与えることができます。 – Ross

答えて

1

名前を取得したいモデルでfind( 'list')を実行することで同じ問題が解決されました。

User-> find( 'list')を検索してコントローラ内の変数に割り当て、そのIDに新しい変数を追加するビューが表示されるようにします。

$ job ['Comment'] ['user_id']を$ usersに変更してください。$ job ['Comment'] ['user_id']]

+0

しかし、そのモデルがロードされていないコントローラ内のモデルでfindを実行する必要があります。そのモデルを読み込むための良い方法が見つかった場合は、その方法をコメントしてください。 – Nightwolf

+0

これは私のために働いた。ありがとうございました。コントローラ: '$ this-> set( 'users'、$ this-> Job-> User-> find( 'list'));'次に、私のビューでは、$ users [$ job ['Comment'] [' user_id ']];' –

+0

この解決方法は選択しません。なぜなら、関連付けを取得するためにCakeが行うことに加えて別のクエリが実行されるからです。したがって、結果として生じるデータベースの負荷は不要です。 '$ displayField'は、他の返信で述べたように、より「Caky」の解決策です。私のコメントはあなたのすべての質問を(うまくいけば)明らかにするでしょう。 – linkyndy

0

UserモデルのdisplayField属性を設定していないのがおそらくあります。

class User extends AppModel { var $displayField = 'username';} 
+1

このような場合は、この変更が有効になるようにビューを再作成する必要があることに注意してください。 – linkyndy

+0

@Beto Frega:コントローラーを再ベイクすることなくビューを再構築すると(追加することを提案したものを効果的に削除する) – Nightwolf

+0

@linkyndy私はビュー自体にかなりの量の変更を加えたので、私は再ベークしたくありません。このコードに何が変わるのでしょうか?私は他の変更を動かさないように手動でコードを変更することができます。 –