2012-10-11 19 views
6

Önceleri özyinelemeye dayanıyordum, ancak bazılarına çözüm getirmedim, sonra da bunun için Sarf Malzemenin iyi çalıştığını keşfettim.CakePHP'de İçeren Koşullar Eklenmesi

Bir film inceleme sitesi geliştiriyorum. Bu yüzden belirli bir Tür ile ilgili filmlerin listesini göstermem gerekiyor.

kod aşağıda bu var:

//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()); 

asıl sorun burada başlıyor, bütün filmleri almak, onun tarz "dram" ile ilgili olmayan bile. Nerede yanlış gidiyorum? Bunu görebilirsiniz movie_genres İşte

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

:

Tablo: filmleri

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

Tablo: türler

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

Tablo

beni veritabanı tablosu anlatayım bir mov ie_id'in birden fazla türü var. Ben sadece mov1 almalıyım ama her iki filmi de bir dizide alıyorum.

~~ EDIT ~~ oops !! Üzgünüz, bu kodu MoviesController numaralı telefondan kullanıyorum. 3 tablonun her biri ilgili denetleyiciye sahiptir. Bu yüzden lütfen bana hangi kontrolörde kullanabileceğimi öner.

DÜZENLEME: 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' => '' 
     ), 
    ); 

} 

Modeli: Tür

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' => '' 
     ) 
    ); 

} 

Modeli: 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

Modeliniz nerede? –

+0

Modeli ekledim :) –

cevap

13

TLDR:, Tür üzerinde find yapmak ve Filmler var içerirler ya da joins() kullanın - seni yapıyor Filmlerde arama yapma ve Şartlı Tür'ü içeren sonuçlar, istediğiniz sonuçlar için çalışmaz.


Açıklama: Aşağıda

için 'içeren' kod düzeltilmiş, ama daha önemlisi, bir aradığınız sonuç döndürmez Türe üzerinde 'içermiyor' yapıyor.

Ne işe yarar - koşulunuza bağlı olarak içerilen türleri sınırlar ... böylece TÜM filmleri çeker ve $genre ile eşleşen türleri içerir.(Ihtiyaçlarınıza göre)


Çözümleri:

  • koşulu ile, Tür üzerinde find() yapın ve

    Çözüm 1) filmlerde olur içerirler. Bu, eşleşen türünü çeker, daha sonra sadece ilgili filmleri çeker.

Çözüm 2) - Bir Ben ') (katılır'

  • kullanın öneriyoruz:

$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); 

Düzenlenmiş (düzeltilmiş imo) 'içerir' 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. Eğer "içeren" yok e modeli (yani senin ihtiva diziden 'Filmi' kaldırıldı) bulmak yapıyoruz.
  2. Sadece model içerir, "MovieGenre.Genre" gibi bir şey kullanmaz. (Kullanacağınız zamanı düşünemiyorum. '.' Bitiştirilmiş modeller)
  3. Özyinelemeli ihtiyaçları kullanmak için Kullanılabilir Bu AppModel -1 için ve yinelemeli kavramını unutma - bu kötü
+0

Müthiş kardeşim, Mükemmel bir şekilde çalışıyor. Cakephp için ileri bir kitap önerebilir misin? Ben böyle bir kitap yapamam. '' Çok teşekkürler:) 'Mükemmel çalışır, '' tırnaklarından bazılarını özlüyorsunuz: P –

+1

http://book.cakephp.org/2.0 harika ve ne kullandım. – Dave

+1

Yardım ettiğine/çalıştığına çok sevindim. Tırnaklar düzeltildi (siz de denediniz gibi görünüyor). – Dave