D'ajouter des conditions à Containable dans CakePHP
Auparavant, j'étais en s'appuyant sur récursive, mais je n'ai pas de solution pour certains, puis j'ai trouvé que le behavior Containable fonctionne très bien pour ces.
Je suis en train d'élaborer un film site de la revue. Dans ce que j'ai besoin d'afficher la liste de films qui est lié à un Genre particulier.
J'ai ce code ci-dessous:
//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());
Le vrai problème commence ici, j'ai tous les films, même si ce n'est pas lié au genre "drame".
Où vais-je tort ?
Laissez-moi vous expliquer la table de base de données:
Table: films
----------------------------
| id | title | description |
----------------------------
| 1 | mov1 | something1 |
| 2 | mov2 | something2 |
| 3 | mov3 | something3 |
----------------------------
Table: genres
---------------
| id | name |
---------------
| 1 | drama |
| 2 | sci-fi |
| 3 | comedy |
---------------
Table: movie_genres
-------------------------------
| id | movie_id | genre_id |
-------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
-------------------------------
Ici, vous pouvez voir que l'un movie_id a plusieurs genre_id. Je devrais obtenir seulement mov1
mais je suis les deux films dans un tableau.
~~ MODIFIER ~~
oups!!
désolé j'ai oublié de mentionner, je suis en utilisant ce code dans MoviesController
. Tous les 3 table a respectifs contrôleur. Ainsi les pls me suggère, dans lequel le contrôleur que je peux utiliser.
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' => ''
),
);
}
Modèle: Genre
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' => ''
)
);
}
Modèle: 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' => ''
)
);
}
- Où est votre modèle ?
- J'ai ajouté le modèle 🙂
Vous devez vous connecter pour publier un commentaire.
TLDR: faire votre trouver sur le Genre et la contenir c'est des Films, ou à utiliser des jointures() - faire votre recherche sur le cinéma et contenant du Genre à conditions de ne pas travailler pour les résultats que vous voulez.
Explication:
Ci-dessous est votre corrigé contient le code, mais plus important encore, de faire un 'contenir' sur le Genre ne renvoie pas les résultats que vous recherchez.
Ce qu'il fait - limite le contenu des genres en fonction de votre état... donc il va tirer TOUS les films, et contenir les genres qui correspondent à
$genre
.Solutions (selon vos besoins):
Solution 1)
find()
sur le Genre, à la condition, et contiennent c'est des films. Cela permettra de tirer le genre qui correspond à, seuls les films qui y sont liés.Solution 2) - celui que je recommanderais
Votre édité (corrigé de l'omi) 'contenir' exemple
Thanks A Lot :)
fonctionne parfaitement, vous manquez quelque de la'
citations 😛