2012-10-11 17 views
6

以前は再帰的に頼っていましたが、解決策をいくつか得られなかったので、Containableはこれらに対してうまく機能しています。CakePHPでContainableに条件を追加する

私は映画レビューウェブサイトを開発しています。その中で、私は特定のジャンルに関連する映画のリストを表示する必要があります。私はコードの下に、このき

//example 
$genre = "drama"; 

$options = array(
    'contain' => array(
     'Movie', 
     'MoveiGenre.Genre' => array(
      'conditions' => array('MovieGenre.Genre.name = "'.$genre.'"') 
     ), 
     'MovieGenre.Genre.name' 
    ), 
    'recursive' => 2, 
    'limit' => 10 
); 
$this->paginate = $options; 
$this->set('movies',$this->paginate()); 

本当の問題はここから始まり、私はそのジャンル「ドラマ」に関連していない場合でも、すべてのムービーを取得します。 どこが間違っていますか?あなたがいることがわかりますmovie_genresここ

------------------------------- 
| id | movie_id | genre_id | 
------------------------------- 
| 1 | 1  | 1   | 
| 2 | 1  | 2   | 
| 3 | 2  | 2   | 
------------------------------- 

表:映画

---------------------------- 
| id | title | description | 
---------------------------- 
| 1 | mov1 | something1 | 
| 2 | mov2 | something2 | 
| 3 | mov3 | something3 | 
---------------------------- 

表:ジャンル

--------------- 
| id | name | 
--------------- 
| 1 | drama | 
| 2 | sci-fi | 
| 3 | comedy | 
--------------- 

私はデータベーステーブルを説明しましょう1つのmov ie_idには複数のgenre_idがあります。私はmov1だけを取得する必要がありますが、私は配列内の両方の映画を取得しています。

~~ EDIT ~~ oops !! 申し訳ありませんが、このコードをMoviesControllerに使用しています。すべての3つのテーブルにはそれぞれのコントローラがあります。だからplsは私が使うことができるコントローラを私に示唆している。

EDIT:2

class Movie extends AppModel { 
    public $displayField = 'title'; 

    public $actsAs = array('Containable'); 

    public $hasMany = array(
     'MovieGenre' => array(
      'className' => 'MovieGenre', 
      'foreignKey' => 'movie_id', 
      'dependent' => false, 
      'conditions' => '', 
      'fields' => '', 
      'order' => '', 
      'limit' => '', 
      'offset' => '', 
      'exclusive' => '', 
      'finderQuery' => '', 
      'counterQuery' => '' 
     ), 
     'MovieLanguage' => array(
      'className' => 'MovieLanguage', 
      'foreignKey' => 'movie_id', 
      'dependent' => false, 
      'conditions' => '', 
      'fields' => '', 
      'order' => '', 
      'limit' => '', 
      'offset' => '', 
      'exclusive' => '', 
      'finderQuery' => '', 
      'counterQuery' => '' 
     ), 
    ); 

} 

モデル:ジャンル

class Genre extends AppModel { 

    public $displayField = 'name'; 

    public $hasAndBelongsToMany = array(
     'Movie' => array(
      'className' => 'Movie', 
      'joinTable' => 'movie_genres', 
      'foreignKey' => 'genre_id', 
      'associationForeignKey' => 'movie_id', 
      'unique' => 'keepExisting', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '', 
      'limit' => '', 
      'offset' => '', 
      'finderQuery' => '', 
      'deleteQuery' => '', 
      'insertQuery' => '' 
     ) 
    ); 

} 

モデル:MovieGenre

class MovieGenre extends AppModel { 

    public $belongsTo = array(
     'Movie' => array(
      'className' => 'Movie', 
      'foreignKey' => 'movie_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
     'Genre' => array(
      'className' => 'Genre', 
      'foreignKey' => 'genre_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ) 
    ); 
} 
+2

モデルはどこですか? –

+0

モデルを追加しました:) –

答えて

13

TLDR:は、ジャンル別にあなたの検索を行うと、それが作品だ含まれていますまたはジョインを使用する() - あなたをするあなたが望む結果を得るためには、映画を検索して条件付きのジャンルを含む検索はできません。


説明:以下

があなたの「を含む」コードを修正しますが、より重要なのは、あなたが探している結果を返さないジャンルに「が含ま」やっています。

あなたの条件に基づいて含まれているジャンルを制限するので、すべてのムービーが取り込まれ、$genreに一致するジャンルが含まれます。


ソリューションズ(必要に応じて):

ソリューション1)

  • 状態で、ジャンルにfind()を行い、そして、それは映画だ含まれています。これは、一致するジャンル、それに関連する映画だけを引き出します。

ソリューション2) - 1はI ')は(参加する'

  • 使用をお勧めします:

$conditions = array(); 
$conditions['joins'] = array(
    array(
     'table' => 'genres_movies', //or movie_genres if you've specified it as the table to use 
     'alias' => 'GenresMovie', 
     'type' => 'INNER' 
     'conditions' => array(
      'GenresMovie.movie_id = Movie.id' 
     ) 
    ), 
    array(
     'table' => 'genres', 
     'alias' => 'Genre', 
     'type' => 'INNER', 
     'conditions' => array(
      'Genre.id = GenresMovie.genre_id', 
      'Genre.name = "' . $genre . '"' 
     ) 
    ) 
); 
$this->Movie->find('all', $conditions); 

編集しました(修正されたimo) 'を含む' exampl

//edited example 
$genre = "drama"; 

$options = array(
    'contain' => array(
     'Genre' => array(
      'conditions' => array('Genre.name' => $genre) 
     ) 
    ), 
    'recursive' => -1, 
    'limit' => 10 
); 
$this->paginate = $options; 
$this->set('movies', $this->paginate('Movie')); 
  1. あなたが「含まれて」いない電子モデルあなたは(つまり、私はあなたの含まれている配列から[ムービー」を削除)上で見つけるやっています。
  2. "MovieGenre.Genre"のようなモデルではなく、モデルが含まれています( '。'連結モデルを使用するとは思いません)
  3. コンテナを使用するには再帰的に-1を設定する必要がありますこれはAppModelの-1になり、再帰の概念を忘れる - それは悪いです
+0

驚くばかりの仲間たち。あなたはcakephpのためのいくつかの先進的な本を提案できますか?私はそのような本はありませんでした。 'Thanks A Lot:)'は完璧に動作します。 '' '引用符のいくつかが欠けています:P –

+1

http://book.cakephp.org/2.0は素晴らしいものです。 – Dave

+1

とても助かりました/働きました。引用符を修正しました(あまりにも試したように見えます)。 – Dave

関連する問題