2012-10-11 36 views
6

में कंटेनर करने योग्य स्थितियों को जोड़ना इससे पहले कि मैं रिकर्सिव पर निर्भर था, लेकिन मुझे कुछ के लिए समाधान नहीं मिला, तो मैंने पाया कि इनके लिए कंटेनबल काम ठीक है।केकेपीएचपी

मैं एक फिल्म समीक्षा वेबसाइट विकसित कर रहा हूं। उसमें मुझे किसी विशेष शैली से संबंधित फिल्मों की सूची दिखाने की ज़रूरत है।

मैं कोड के नीचे इस राशि:

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

वास्तविक समस्या यहाँ शुरू होता है, मैं सभी फिल्मों मिलता है, भले ही अपनी शैली "नाटक" से संबंधित नहीं। मैं गलत कहां जा रहा हूं?

तालिका:: फिल्मों

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

तालिका: शैलियों

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

तालिका: movie_genres

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

यहाँ आप देख सकते हैं कि

मुझे डेटाबेस तालिका के बारे में बताएं एक mov ie_id में एकाधिक genre_id है। मुझे केवल mov1 मिलना चाहिए, लेकिन मुझे दोनों फिल्मों को एक सरणी में मिल रहा है।

~~ संपादित करें ~~ ओह !! क्षमा करें क्षमा करना भूल गया, मैं इस कोड का उपयोग MoviesController में कर रहा हूं। सभी 3 टेबल में संबंधित नियंत्रक है। तो कृपया मुझे सुझाव दें कि मैं किस नियंत्रक का उपयोग कर सकता हूं।

संपादित करें: 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) - एक मैं

  • उपयोग की सलाह देते हैं 'जुड़ जाता है()':

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

आपके संपादित (सही आईएमओ) 'युक्त' परीक्षा ई

//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. आपके पास केवल "मूवीजेंर.जेनेर" जैसी चीजें नहीं हैं (मैं किसी भी समय आप 'का उपयोग नहीं कर सकता।'
  3. रिकर्सिव का उपयोग करने के लिए -1 होना आवश्यक है - आपको सेट करना चाहिए ऐपमोडेल में यह -1 और रिकर्सिव की अवधारणा को भूल गया - यह खराब है
+0

बहुत बढ़िया ब्रो, पूरी तरह से काम करने में शामिल हो जाता है। क्या आप केकफ़्पी के लिए कुछ उन्नत पुस्तक सुझा सकते हैं। मैं ऐसी कोई किताब नहीं कर सका। 'धन्यवाद बहुत लोट:)' सही काम करता है, आप कुछ उद्धरणों को याद करते हैं: पी –

+1

http://book.cakephp.org/2.0 भयानक है और मैंने जो उपयोग किया है। – Dave

+1

बहुत खुश है कि यह मदद/काम किया। उद्धरण फिक्स्ड (ऐसा लगता है जैसे आप भी कोशिश की - ty)। – Dave