Bonjour à tous,
J'ai commencé à développer un site avec CakePHP3 et je bloque sur une relation.
Soit l'entité Movies et la table de liaison MoviesMovies. Chaque film est en relation avec d'autres films mais sans sens dans la relation.
Avec CakePHP2, j'utilisais la propriété finderQuery dans la définition de ma relation :
public $hasAndBelongsToMany = array(
'Movies' => array(
'finderQuery' => 'SELECT movies.* FROM movies JOIN movies_movies ON (movies_movies.movie_1_id = movies.id AND movies_movies.movie_2_id = {$__cakeID__$}) OR (movies_movies.movie_2_id = movies.id AND movies_movies.movie_1_id = {$__cakeID__$})'
)
);
J'essaye de reproduire ce comportement avec CakePHP3 et la propriété finder mais je n'y arrive pas et je ne trouve pas l'équivalent de {$cakeID$} :
$this->belongsToMany('Movies', [
'finder' => 'relations'
]);
public function findRelations(Query $query, array $options){
$query->join([
'mm' => [
'table' => 'movies_movies',
'type' => 'INNER',
'conditions' => [
'OR' => [
'AND' => ['mm.movie_1_id = movies.id', 'mm.movie_2_id = {$__cakeID__$}'],
'AND' => ['mm.movie_2_id = movies.id', 'mm.movie_1_id = {$__cakeID__$}']
],
]
]
]);
return $query;
}
Est-ce que je suis parti sur la bonne piste pour cette relation réfléxive et comment écrire le finder personnalisé pour retourner les relations ?
Bonjour,
J'ai essayé mais cela implique une relation parent/fils, ce qui n'est pas le cas ici.
J'ai trouvé une solution de contournement en décrivant 2 relations :
$this->belongsToMany('MoviesL', [
'through' => 'MoviesMovies',
'foreignKey' => 'movie_1_id',
'targetForeignKey' => 'movie_2_id'
]);
$this->belongsToMany('MoviesR', [
'through' => 'MoviesMovies',
'foreignKey' => 'movie_2_id',
'targetForeignKey' => 'movie_1_id'
]);
Et je merge les deux résultats dans un finder personnalisé, mais cela n'est pas pour moi la meilleure solution.