Trước đây tôi đã dựa vào đệ quy, nhưng tôi đã không nhận được giải pháp cho một số, sau đó tôi thấy rằng Containable hoạt động tốt cho chúng.Thêm điều kiện vào Có thể chứa trong CakePHP
Tôi đang phát triển một trang web đánh giá phim. Trong đó tôi cần phải hiển thị danh sách các bộ phim có liên quan đến một thể loại cụ thể.
Tôi có điều này bên dưới mã:
//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());
Vấn đề thực sự bắt đầu ở đây, tôi nhận được tất cả các phim, thậm chí nếu nó không liên quan đến thể loại "phim". Tôi đang đi sai ở đâu?
Hãy để tôi giải thích các bảng cơ sở dữ liệu:
Bảng: phim
----------------------------
| id | title | description |
----------------------------
| 1 | mov1 | something1 |
| 2 | mov2 | something2 |
| 3 | mov3 | something3 |
----------------------------
Bảng: thể loại
---------------
| id | name |
---------------
| 1 | drama |
| 2 | sci-fi |
| 3 | comedy |
---------------
Bảng: movie_genres
-------------------------------
| id | movie_id | genre_id |
-------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
-------------------------------
Ở đây bạn có thể thấy rằng một mov ie_id có nhiều genre_id. Tôi sẽ chỉ nhận được mov1
nhưng tôi nhận được cả hai phim trong một mảng.
~~ EDIT ~~ oops !! xin lỗi quên đề cập đến, tôi đang sử dụng mã này trong MoviesController
. Tất cả 3 bảng có bộ điều khiển tương ứng. Vì vậy, xin đề nghị tôi trong đó bộ điều khiển tôi có thể sử dụng.
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' => ''
),
);
}
mẫu: Thể loại
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' => ''
)
);
}
mẫu: 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' => ''
)
);
}
Mô hình của bạn ở đâu? –
Tôi đã thêm mô hình :) –