CakePHP HABTM récupérer quelles conditions
-
21-09-2019 - |
Question
J'utilise CakePHP et voudrais afficher toutes les soumissions qui font partie de la catégorie « X » J'ai 4 tables avec une relation HABTM.
Utilisateurs -> (haveMany) -> Mémoires <-> (hasAndBelongsToMany) <-> Catégories
mais je voudrais le faire en utilisant le $ this-> paginate () et pour chaque soumission, je voudrais afficher l'utilisateur qui a posté la soumission.
Tableau utilisateur
Id | Name
-----+-------------------
1 | User 1
2 | User 2
Tableau de soumission
Id | Name | User_id
-----+-------------------+--------------
1 | Submission 1 | 1
2 | Submission 2 | 2
Table catégorie
Id | Name
-----+-------------------
1 | Category 1
2 | Category 2
SubmissionCategory table
Id | Submission_id | Category_id
-----+-------------------+-------------------
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
Je vais avoir du mal à créer vraiment un paginate qui peut le faire, je commence à penser son pas possible à moins que je me manque quelque chose.
Si je n'utilisais pas CakePHP c'est la question que je voudrais faire
SELECT
*
FROM
submissions_categories,
submissions,
users
WHERE
submissions_categories.category_id = 8
AND
submissions_categories.submission_id = submissions.id
AND
submissions.user_id = users.id
La solution
relations HABTM sont très difficiles à manier dans CakePHP je trouve. Vous allez avoir besoin de mettre en place manuellement à l'aide les jointures de la variable $ paginate. Ensuite, vous pouvez passer dans le tableau de conditions optionnelles à la fonction paginate (). Exemple:
<?php
class SubmissionsController extends AppController {
var $name = 'Submissions';
var $helpers = array('Html', 'Form');
var $paginate = array('joins' => array(
array(
'table' => 'submissions_categories',
'alias' => 'SubmissionsCategory',
'type' => 'inner',
'conditions'=> array('SubmissionsCategory.submission_id = Submission.id')
),
array(
'table' => 'categories',
'alias' => 'Category',
'type' => 'inner',
'conditions'=> array(
'Category.id = SubmissionsCategory.category_id'
)
)));
function index() {
$this->Submission->recursion = 1;
$this->set('submissions', $this->paginate(array('Category.id'=>1)));
}
}
?>