2017-06-15 7 views
0

私は2つのテーブルのデータベースを持っています。 1つはブログ投稿と1つのユーザー、1つは投稿テーブルのuser_idフィールドと関連しています。私のインデックスページでは、私は投稿のテーブルを持っていますが、私は著者のIDを表示するのではなく、ユーザーの名前を表示したいのです。しかし、これは私がnullにfindByIdを呼び出していますエラーをもたらしますmysqlを使ってCakePHPの関連レコードにアクセスする方法は?

public function index() { 
    $this->set('posts', $this->Post->find('all')); 
    foreach ($this as $post){ 
     $post['Post']['author'] = $this->User->findById($post['Post']['user_id']); 
    } 
} 

:私はPostsControllerの中にこのような私のポストオブジェクトに著者フィールドを追加しようとしています。私は非常にPHPに新しいですので、私はループを使用する方法の私の理解が間違っているかもしれないと思う。おそらく、ループを必要としないより良い方法がありますか?

+0

'$ this-> User'を利用できるようにするために' $ this-> loadModel( 'User'); 'を呼び出すことはありません。あなたはどこか他のところでやっていますか? – rickdenhaan

+0

oopsはい私はこれで今、foreachの行に "配列として文字列オフセットを使用できません"というエラーが表示されることを追加しました – Ben

答えて

0

CakePHPのコントローラは、デフォルトで独自のモデルのみを読み込みます。ある時点で追加モデルが必要な場合は、load it in manuallyが必要です。

find()アクションの結果をビューに直接設定しているため、問題は解決しません。ユーザーを追加するまで待つことをお勧めします。あなたのクラスは、(コントローラが行うには理由があるべきではありません)Iterator様インタフェースを実装しない限り、ああ、あなたは通常

public function index() { 
    // first load in the User model 
    $this->loadModel('User'); 

    // store the posts in a local variable first 
    $posts = $this->Post->find('all'); 

    // loop through the local variable, also keep the index so we can reference 
    // the post we're modifying 
    foreach ($posts as $index => $post) { 
     $post['Post']['author'] = $this->User->findById($post['Post']['user_id']); 

     // write the modified $post back into the $posts array 
     $posts[$index] = $post; 
    } 

    // **now** you can make $posts available to your view 
    $this->set('posts', $posts); 
} 

あなたは、これは整理したら、read up on linking models togetherforeach$thisを反復処理することはできません。 Postモデルを設定して、に対応するUserを自動的に入力する必要はありません。手動で行う必要はありません。

0

モデルでリレーションを指定する方がよいでしょう。ポストモデルで

は、リンクされたモデルデータ

$posts = $this->Post->find('all')->contain(['User']); 

$this->set('posts', $posts); 

あなたは各ポストレコードを持つUserオブジェクトを取得しますを取得するために)(含まれポストとコントローラの使用中の今、ユーザー

public $hasOne = 'User'; 

との関係を初期化していますユーザー名を取得するために使用することができますが、ユーザー名を取得するために別のクエリを記述する必要はありません。

関連する問題