Bonjour,
Voilà ma structure, j'ai 2 tables reliées par une troisième en belongsToMany, du classique :
Towns belongsToMany EventTypes
EventTypes belongsToMany Towns
EventTypesTowns belongsTo EventTypes & EventTypesTowns belongsTo Towns
Ceci permet donc de lier une Town a un ou plusieurs EventTypes. Mais j'ai un cas particulier : certains EventTypes sont reliés à toutes les Town, j'ai donc ajouter dans la table EventTypes un flag qui permet de savoir si un EventTypes est relié à toutes les villes (j'ai fait cela pour ne pas rajouter toutes les lignes de liaisons dans la table EventTypesTowns).
Le problème est que maintenant que, étant donné une Town et une requête de recherche q sur un EventTypes j'aimerai récupéré les EventTypes correspondant à q qui sont liés dans la table de liaison mais aussi les EventTypes qui ont le flag a true.
J'ai essayer différentes méthodes en une seule requête mais je n'y arrive pas, alors je me suis dit en faissant 2 requêtes que cela serait plus simple mais non ...
// paramètres
$q = $this->request->data['q'];
$town_id = $this->request->data['town_id'];
// récupération des EventTypes "général" à toute les Towns
$eventTypes = $this->EventTypes->find('all')
->where(['EventTypes.name LIKE' => "%".$q."%"])
->orWhere(['EventTypes.slug LIKE' => "%".$q."%"])
->where(['EventTypes.is_all_town' => 1])
->select(['EventTypes.id', 'EventTypes.name', 'EventTypes.is_all_town']);
$eventTypes = $eventTypes->toArray();
// On récupère les EventTypes de la ville
$town = $this->EventTypes->Towns->get($town_id, [
'contain' => [
'EventTypes' => function ($query) use ($q) {
return $query
->select(['EventTypes.id', 'EventTypes.name', 'EventTypes.is_all_town'])
->where(['EventTypes.name LIKE' => "%".$q."%"])
->orWhere(['EventTypes.slug LIKE' => "%".$q."%"]);
}
]
]);
// Fusion des résultats
if ($town)
$eventTypes = array_merge($eventTypes, $town->event_types);
Comment réunir ces 2 requêtes ?
Aussi, ce code marche dans une action de test, mais pas en en ajax !? (en ajax le bug est sur la 2° requête)
Quelqu'un aurait une idée ?
Cordialement
J'ai trouvé la solution :
1 - le code fonctionnait dans une action mais pas en ajax : j'ai trouvé que le $town_id que je récupérais valait -1
2 - quand on fait une requête sur la base donnée avec un get et qu'il ne trouve pas la donnée il ne retourne pas null, il lance une exception de type RecordNotFoundException
Pour résoudre mon problème, j'ai donc corriger le bug javascript pour qu'il envoie bien la valeur $town_id, et j'ai rajouté pour plus de sureté un try catch sur le get.
Je ne sais pas vu que ca marche pas trop bien j'ai pas encore pu tester cela, mais avec les peus de tests effectués pas pour l'instant.
Vous devriez lire ca doc
On peut en effet modifier et ajouter des contraintes sur les clés et autre