IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

CakePHP v3: Mon premier test BelgonsToMany [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 48
    Points : 48
    Points
    48
    Par défaut CakePHP v3: Mon premier test BelgonsToMany
    Bonjour,

    J'ai deux tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE TABLE `tvs` (
     `TV_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `TV_NOM` varchar(255) NOT NULL,
     `TV_SLIDE` varchar(255) DEFAULT NULL,
     `TV_SLIDE_VERSION` int(10) unsigned DEFAULT NULL,
     `TV_WIDTH` smallint(6) NOT NULL,
     `TV_HEIGHT` smallint(6) NOT NULL,
     `TV_REFRESH_TIME` int(11) NOT NULL,
     `TV_DATE_DERNIÈRE_CONNEXION` datetime DEFAULT NULL,
     PRIMARY KEY (`TV_ID`),
     KEY `TV_NOM` (`TV_NOM`(191))
    ) ENGINE=InnoDB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE `slides` (
     `SLIDE_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `SL_SLIDE` varchar(255) NOT NULL,
     PRIMARY KEY (`SLIDE_ID`)
    ) ENGINE=InnoDB;
    Pour relier ces deux tables, j'ai une table de relations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    CREATE TABLE `slides_tvs` (
     `TV_ID` int(10) unsigned NOT NULL,
     `SLIDE_ID` int(10) unsigned NOT NULL,
     `TS_JOURS_SEMAINE` bit(7) NOT NULL,
     `TS_DATE_DÉBUT` date NOT NULL,
     `TS_DATE_FIN` date NOT NULL,
     `TS_HEURE_DÉBUT` time NOT NULL,
     `TS_HEURE_FIN` time NOT NULL,
     PRIMARY KEY (`TV_ID`,`SLIDE_ID`),
     KEY `TS_JOURS_SEMAINE` (`TS_JOURS_SEMAINE`),
     KEY `TS_DATE_DÉBUT` (`TS_DATE_DÉBUT`),
     KEY `TS_DATE_FIN` (`TS_DATE_FIN`),
     KEY `TS_HEURE_DÉBUT` (`TS_HEURE_DÉBUT`),
     KEY `TS_HEURE_FIN` (`TS_HEURE_FIN`),
     KEY `slides_tvs_ibfk_slide_id` (`SLIDE_ID`),
     CONSTRAINT `slides_tvs_ibfk_slide_id` FOREIGN KEY (`SLIDE_ID`) REFERENCES `slides` (`SLIDE_ID`),
     CONSTRAINT `slides_tvs_ibfk_tv_id` FOREIGN KEY (`TV_ID`) REFERENCES `tvs` (`TV_ID`)
    ) ENGINE=InnoDB;
    J'ai donc créé deux classes "Tables":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <?php
    namespace  App\Model\Table;
     
    use Cake\ORM\Table;
     
    class TvsTable extends Table {
     
      public function initialize(array $config) {
          $this->belongsToMany('Slides', [
              'joinTable' => 'slides_tvs',
              'foreignKey' => 'tv_id',
              'targetForeignKey' => 'slide_id'
              ]);
      }
     
    }
     
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <?php
    namespace  App\Model\Table;
     
    use Cake\ORM\Table;
     
    class SlidesTable extends Table {
     
      public function initialize(array $config) {
        $this->belongsToMany('Tvs', [
            'joinTable' => 'slides_tvs',
            'foreignKey' => 'slide_id',
            'targetForeignKey' => 'tv_id'
        ]);
     
      }
     
    }
     
    ?>
    Dans mon controller voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?php
    namespace App\Controller;
     
    use App\Controller\AppController;
    use Cake\ORM\TableRegistry;
    use Cake\Event\Event;
    use Cake\Auth\BaseAuthenticate;
    use Cake\Auth\DefaultPasswordHasher;
    use Cake\View\Helper\HtmlHelper;
    use App\Model\Entity\TvsEntity;
     
    class TvsController extends AppController {
     
      public function ModifierTv($id) {
        $query_tv = TableRegistry::get('tvs');
     
        $rows_tv = $query_tv->find('all')->where(['tv_id' => 1])->contain(['Slides'])->all();
        debug($rows_tv);
        debug($rows_tv->first()->slides);  
      }
     
    }
    ?>
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SlidesTvs.slide_id AS `SlidesTvs__slide_id`, SlidesTvs.TV_ID AS `SlidesTvs__TV_ID`, SlidesTvs.SLIDE_ID AS `SlidesTvs__SLIDE_ID`, SlidesTvs.TS_JOURS_SEMAINE AS `SlidesTvs__TS_JOURS_SEMAINE`, SlidesTvs.TS_DATE_DÉBUT AS `SlidesTvs__TS_DATE_DÉBUT`, SlidesTvs.TS_DATE_FIN AS `SlidesTvs__TS_DATE_FIN`, SlidesTvs.TS_HEURE_DÉBUT AS `SlidesTvs__TS_HEURE_DÉBUT`, SlidesTvs.TS_HEURE_FIN AS `SlidesTvs__TS_HEURE_FIN`, Slides.SLIDE_ID AS `Slides__SLIDE_ID`, Slides.SL_SLIDE AS `Slides__SL_SLIDE` FROM slides Slides INNER JOIN slides_tvs SlidesTvs ON Slides.SLIDE_ID = (SlidesTvs.slide_id) WHERE SlidesTvs.tv_id in ('1')
    Et cette requête renvoie bien un résultat...

    Quelqu'un peut-il m'aider ?

    Merci d'avance,
    Alain

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 48
    Points : 48
    Points
    48
    Par défaut
    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,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSF] mon premier JSF:Cannot find FacesContext
    Par anitshka dans le forum JSF
    Réponses: 15
    Dernier message: 24/08/2007, 18h19
  2. [AJAX] Mon premier test avec Ajax : échec
    Par Nasky dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/05/2007, 01h24
  3. [Débutant] Mon premier programme: rien ne va...
    Par vincent0 dans le forum OpenGL
    Réponses: 10
    Dernier message: 02/08/2005, 13h59
  4. [JSF] mon premier custom component
    Par anitshka dans le forum JSF
    Réponses: 5
    Dernier message: 14/06/2005, 13h31
  5. [debutant]Mon premier prog OpenGL
    Par Revan777 dans le forum OpenGL
    Réponses: 5
    Dernier message: 04/04/2005, 17h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo