Bonjour.
Alors pour commencer, évites le plus possible de mettre des noms de champs en majuscule ainsi qu'avec des accents.
Ensuite, comment se fait-il que tu aies deux clés primaire dans la table de relation ?
Pour terminer, pourquoi est-ce que tu fais un TableRegistrypour le modèle Tvs alors que tu es dans le controller Tvs ?
Ta requête n'est pas correcte, fais plutôt :
Bonjour,
J'ai deux tables:
Pour relier ces deux tables, j'ai une table de relations:
J'ai donc créé deux classes "Tables":
Dans mon controller voici mon code:
Et je me retrouve avec une propriété Slides dans "$rows_tv" mais qui est désespérément vide...
Alors qu'il existe une relation pour l'id_tv = 1 avec un slide...
De plus quand je regarde les "Sql-log" je vois:
Et cette requête renvoie bien un résultat...
Quelqu'un peut-il m'aider ?
Merci d'avance,
Alain
9 réponses
Bonjour Lartak,
Merci pour ta réponse.
Concerant ta remarques pour les majuscules, j'en tiendrais compte à l'avenir. Pour les accents, j'ai bien essayé de retirer le È du champ "TV_DATE_DERNIÈRE_CONNEXION" cela n'a pas résolu mon problème.
Si la table slides_tvs est la table de relation entre la table tvs et la table slides... Il me semble normal de créer une clé primaire sur les champs qui référencent respectivement chaqune des deux tables pour éviter que l'on puisse créer deux fois la même relation...
Je suis débutant en CakePhp et même si j'ai déjà pas mal épluché la doc, je ne connais pas encore toutes les utilisations que je peux faire en respectant les pré-requis.
En lisant la ligne de code que tu m'as donné, j'imagine donc que dans le controller de même nom que la table que je cherche à atteindre, je devrais pouvoir y accéder en faisant "$this->Tvs" au lieu de TableRegistry::get('tvs')...
Néanmoins que j'ajoute dans mon controller Tvs ta ligne de code j'obtiens l'erreur suivante:
Peut-être peux-tu me dire pourquoi?
Re-bonjour Lartak,
Ta ligne de code fonctionne si j'ajoute les lignes suivantes dans mon controller:
Mais lorsque j'affiche:
La propriété 'Slides' est à nouveau un tableau vide...
Il me semble normal de créer une clé primaire sur les champs qui référencent respectivement chaqune des deux tables pour éviter que l'on puisse créer deux fois la même relation...
Dans une table, tu ne dois pas pouvoir créer deux clés primaire normalement.
Une clé primaire est censé être unique dans une table.
j'imagine donc que dans le controller de même nom que la table que je cherche à atteindre, je devrais pouvoir y accéder en faisant "$this->Tvs" au lieu de TableRegistry::get('tvs')...
C'est exact, il est inutile de vouloir charger un modèle qui est déja lié.
Pour charger un modèle qui n'est pas lié, tu peux très bien utiliser $this->loadModel('ModelName')à la place de TableRegistry::get('ModelName').
Pour finir, tu as trop de use inutile, tu peux enlever tout ça :
Mais lorsque j'affiche:
Mais c'est quoi tout ces all ?
Et pourquoi tu fais un $this->loadModel('Tvs') alors que c'est le modèle courant ?
Lartak,
Alors le 'all' comme paramètre à la fonction find()... J'avoue ne pas trop savoir à quoi il sert... Je l'ai vu écris à plusieurs reprises mais que tu le mettes ou que tu l'enlèves ne semble pas affecter le résultat...
Pour le "...->all()":
1) Soit tu écris exactement ta ligne de code et tu obtiens en retour un objet "Cake\ORM\Query" que tu dois itérer pour obtenir les résultats. Ce que j'ai fait ici mais à nouveau la propriété "Slides" de "$testRow" reste vide:
2) Soit pour éviter d'avoir à itérer les résultats tu ajoutes "...->all()" et tu obtiens sans itération un objet "Cake\ORM\ResultSet" qui te retourne tous les résultats de ta requête...
Sauf que là, tu mets deux fois la clé all, ce qui est totalement inutile.
Que tu la mette une fois, je veux bien, mais pas deux fois.
Lartak,
Il subsiste un comportement anormal et je ne comprends pas pourquoi.
J'ai créé un nouvelle table indépendante (j'ai mis tous les champs en minuscule):
J'ai créé un nouveau controller:
Forcément j'ai créé un vue "index.ctp" dans lequel je n'ai rien mis...
J'ai ajouté une route:
Et lorsque j'accède à http://.../tv2
$this->Televisions vaut false à nouveau comme si cakePhp ne chargeait pas le modèle par défaut...
J'ai oublié qques choses?
Pour que cela fonctionne je dois obligatoirement ajouter dans le controller:
Bonjour à tous,
J'ai finalement trouvé la solution.
1) Dans mes routes, j'avais écris:
Router::connect('/', ['controller' => 'tvs', 'action' => 'login']);
Alors qu'il fallait indiquer:
Router::connect('/', ['controller' => 'Tvs', 'action' => 'login']);
Si vous ne mettez pas le première lettre du controller en majuscule, ça fonctionne sauf que lorsque vous voulez accéder au modèle par défaut depuis votre controller, là cela ne fonctionne plus...
2) Il faut mettre les noms des champs de la base de données en minuscule... c'est ce qui empêchait le belongsToMany de fonctionner...
Merci à tous,