Je récupère une variable en js que je fais passer en URL à mon controler.
$("#searchVille").click(function () {
//Récupération de la date de début de location
var jourDebutLoc = $("select[name='location[dateDebutLoc][day]'] > option:selected").text();
jourDebutLoc = jourDebutLoc.padStart(2,'0');
var moisDebutLoc = $("select[name='location[dateDebutLoc][month]'] > option:selected").val();
moisDebutLoc = moisDebutLoc.padStart(2,'0');
var anneeDebutLoc = $("select[name='location[dateDebutLoc][year]'] > option:selected").text();
var dateDebutLoc = anneeDebutLoc + "-" + moisDebutLoc + "-" + jourDebutLoc ;
console.log('date : ', dateDebutLoc);
// Récupération du fichier Xml
xmlhttp.open("GET", "/loc_toto/allLoueursXml?dateDeb=" + dateDebutLoc, false);
xmlhttp.overrideMimeType("text/xml");
xmlhttp.send();
var xmlDoc = xmlhttp.responseXML;
....
Mon controller récupère la variable pour la faire passer à la requête
/**
* @Route("/loc_toto/allLoueursXml/{dateDebutLoc}", name="all_loueurs_xml")
* @param Date $dateDebutLoc
*/
public function allLoueursXml(LocationRepository $repo, $dateDebutLoc) {
$loueurs = $repo->findAllLoueursWithDispo($dateDebutLoc);
//$loueurs = $repo->findAll();
//var_dump($loueurs);
$listeLoueurs = ['marker' => []];
foreach ($loueurs as $loueur) {
$listeLoueurs['marker'][] = [
....
Et voici ma requête
public function findAllLoueursWithDispo ($dateDebutLoc) {
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT *
FROM location_balise lbd
RIGHT JOIN location loc ON loc.id = lbd.location_id
RIGHT JOIN balise bal ON bal.id = lbd.balise_id
WHERE bal.fonctionnel = true
AND loc.date_debut_loc NOT IN ("dateDebutLoc")
OR loc.date_debut_loc IS NULL'
)->setParameter('dateDebutLoc', $dateDebutLoc);
// returns an array of Product objects
return $query->execute();
}
Voici l'erreur :
GET http://127.0.0.1:8000/loc_toto/allLoueursXml?dateDeb=2014-01-01 404 (Not Found)
A mon avis le problème vient de mon JS et de l'envoi du paramètre dans l'URL. Comment dois-je écrire tout celà ?
- Edité par ElodieMartin13 23 septembre 2019 à 12:01:51
Tu ne sais pas comment créer une route ?
C'est du texte qui fait du code, tu as fourni un exemple dans ton second bloc de code du premier message, je crois que tu devrais pouvoir t'en sortir
ElodieMartin13 a écrit:
Par contre je ne comprends pas ton 2eme point
Un paramètre dans une requête (on appelle plutôt ça marqueur, au temps pour moi) n'est pas juste une suite de caractères, il faut soit que cette suite commence par :, soit remplacer toute cette suite par un simple ?.
Tu ne sais pas comment créer une route ? C'est du texte qui fait du code, tu as fourni un exemple dans ton second bloc de code du premier message, je crois que tu devrais pouvoir t'en sortir
Ben j'ai fait la même chose que celle du dessous en passant le paramètre sauf que tu m'as dit qu'elle est fausse, qu'il manque un prefixe et que je ne vois pas du tout ce que tu veux dire.
// Envoi du paramètre au Controller
xmlhttp.open("GET", "/loc_toto/allLoueursXml"+dateDebutLoc, false);
ElodieMartin13 a écrit:
Un paramètre dans une requête (on appelle plutôt ça marqueur, au temps pour moi) n'est pas juste une suite de caractères, il faut soit que cette suite commence par :, soit remplacer toute cette suite par un simple ?.
Ceci serait-il mieux ?
public function findAllLoueursWithDispo ($dateDebutLoc) {
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT *
FROM location_balise lbd
RIGHT JOIN location loc ON loc.id = lbd.location_id
RIGHT JOIN balise bal ON bal.id = lbd.balise_id
WHERE bal.fonctionnel = true
AND loc.date_debut_loc NOT IN :dateDebutLoc
OR loc.date_debut_loc IS NULL'
)->setParameter('dateDebutLoc', $dateDebutLoc);
// returns an array of Product objects
return $query->execute();
}
- Edité par ElodieMartin13 24 septembre 2019 à 11:15:28
Pour tester ton controlleur, il te suffit de mettre taper ton url directement dans la barre d'adresse:
http://127.0.0.1:8000/loc_dial/allLoueursXml/2019-09-18 (enfin tu mets la date que tu veux)
Comme ça tu travailles directement sur ton controlleur et les erreurs s'afficheront. Et une fois que tu auras ce que tu veux, tu pourras retourner voir si ça fonctionne via ton xlmhttp.open.
Bon alors, j'ai résolu pas mal d'erreur, par contre celle-ci je ne vois pas du tout comment faire.
[Semantical Error] line 0, col 39 near 'location_balise': Error: Class 'location_balise' is not defined.
En fait il s'agit d'une table supplémentaire qui a été créé car j'ai 2 ManyToMany. Du coup l'entité n'existe pas, et la table n'existe que dans la base de données.
Une astuce ?
- Edité par ElodieMartin13 23 septembre 2019 à 12:04:27
Alors attention, avec createQuery(), ce n'est plus du SQL qu'il faut faire, mais une variante propre à Doctrine. Tu n'utilises plus les tables et les colonnes, mais les entités et les propriétés de celles-ci. Ce qui fait qu'en cas de ManyToMany, ce qui est matérialisé par une table de liaison dans la base de données n'apparaît pas en DQL, parce que cette table de liaison n'est pas une entité.
Alors j'ai retravaillé ma requête et ca donne ceci :
public function findAllLoueursWithDispo ($dateDebutLoc) {
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT loc, bal
FROM Location loc
RIGHT JOIN Balise bal ON bal.locations = loc.balise_id
WHERE bal.fonctionnel = true
AND loc.dateDebutLoc NOT IN :dateDebutLoc
OR loc.dateDebutLoc IS NULL'
)->setParameter('dateDebutLoc', $dateDebutLoc);
// returns an array of Product objects
return $query->execute();
}
Par contre mon entité Location apparait en bleu (dans mon code) comme les mots en majuscule et j'ai le message d'erreur suivant alors que mon entité Location.php existe bien !
[Semantical Error] line 0, col 34 near 'Location AS loc': Error: Class 'Location' is not defined.
- Edité par ElodieMartin13 23 septembre 2019 à 12:05:17
Mais il ne veut pas prendre mes attributs, j'ai pourtant mis ceux de mes entités
[Semantical Error] line 0, col 93 near 'locations = loc.balise_id': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
- Edité par ElodieMartin13 23 septembre 2019 à 12:06:07
je ne réponds pas directement à ton problème, mais pourquoi n'utilises-tu pas les Repository? Ta requête serait beaucoup plus simple et ton code serait mieux organisé.
Alors voici ma requête modifiée, elle fonctionne presque. Elle m'enlève bien les locations qui sont faites à la date donnée sauf qu'elle ne m'affiche pas les loueurs qui ont une valeur nulle dans la date. C'est ce que me permettait de faire le rightJoin.
Tu ne te trompes pas, je suis bien dans Location Repository !
La requête est bien plus complexe que cela.
Il faut que j'ai la liste des balises disponible aux dates de réservation. Une fois que j'ai cette liste il faut que je calcul combien il y a de balise par loueur.
Et ensuite mon script ajax s'occupe d'afficher les loueurs à proximité et ayant assez de stock en fonction de la quantité commandée.
Doctrine propose des solutions pour regrouper selon certains critères et pour compter des choses, pourquoi ne tenterais-tu pas de les utiliser pour alléger ton script et gagner un peu en performances ? Une base de données est faite pour permettre ce genre d'opérations facilement
Avec l'objet QueryBuilder de Doctrine, si j'ai bien compris ce que tu souhaites faire, il faudrait ajouter la sélection du champ qui va permettre de compter (quelque chose comme addSelect('count(loueur.id)) et la clause de regroupement sur l'ID de l'objet Location (groupBy('loc.Id')). Au passage, si tu sais comment faire en pur SQL, il ne devait te manquer que les noms des méthodes à appeler.
La seule chose qui pourrait être gênante, c'est le format de résultat avec Doctrine quand on fait ces comptes, mais on verra ça par la suite.
Oublie la construction d'un tableau avec le résultat de la requête, on devrait pouvoir s'en passer. Note que, pour savoir comment sont organisées des données, tu as toujours var_dump() et avec Symfony, tu as dump() tout court.
Attention, j'avais bien parlé de addSelect(). select('quelquechose') pourrait bien faire que, justement, tu n'aies plus qu'un nombre comme résultat, au mieux une liste de nombres…
J'aimerais volontiers voir la requête SQL qui est générée par ce QueryBuilder. Dans la barre de débogage, tu trouveras un "onglet" Doctrine, et cela te mène vers une page qui liste toutes les requêtes effectuées pour générer la page, requêtes en DQL comme traduites en SQL.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales