2017-05-15 1 views
0

J'ai une table appelée utilisateurs et il est connecté à entraîneurs et clients.CakePHP recherche dans plusieurs modèles

Je souhaite effectuer une recherche dans les tableaux des utilisateurs et des entraîneurs.

Mes tableaux ressemblent à ceci:

CREATE TABLE IF NOT EXISTS `team07`.`users` (
    `id` INT(11) NOT NULL, 
    `email` VARCHAR(45) NOT NULL, 
    `password` VARCHAR(255) NOT NULL, 
    `usertype` CHAR(2) NOT NULL, 
    `created` DATETIME NOT NULL, 
    `modified` DATETIME NULL DEFAULT NULL, 
    `firstname` VARCHAR(45) NOT NULL, 
    `lastname` VARCHAR(45) NOT NULL, 
    `phonenumber` VARCHAR(45) NOT NULL, 
    `suburb` VARCHAR(45) NOT NULL, 
    `state` VARCHAR(10) NOT NULL, 
    `businessname` VARCHAR(45) NULL DEFAULT NULL, 
    `image` BLOB NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `email_UNIQUE` (`email` ASC)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

Et aussi

CREATE TABLE IF NOT EXISTS `team07`.`coaches` (
    `id` INT NOT NULL, 
    `coachid` INT NOT NULL, 
    `appstate` INT NOT NULL, 
    `bio` VARCHAR(2048) NULL, 
    `price` INT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `COACH_INFOFK_idx` (`coachid` ASC), 
    UNIQUE INDEX `coachid_UNIQUE` (`coachid` ASC), 
    CONSTRAINT `COACH_INFOFK` 
    FOREIGN KEY (`coachid`) 
    REFERENCES `team07`.`users` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

C'est ce que le code que je fais ressemble:

public function review() 
    { 
     //Select all users which are a Coach AND have appstate = 1 (Just signed up, in review)  
     $users = $this->paginate($this->Users); 
     $users = $this->Users->find('all')->where(['Users.usertype'=>'CO', 'Coaches.appstate'=>'1']); 

     $this->set(compact('users')); 
     $this->set('_serialize', ['users']); 
    } 

Cependant, j'ai des problèmes parce que ma page répond avec

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Coaches.appstate' in 'where clause'

Comment résoudre ce problème?

Répondre

1

Si l'association est compris par le gâteau, vous pouvez utiliser pour contenir le charger: https://book.cakephp.org/3.0/en/orm/query-builder.html#loading-associations

donc quelque chose comme ceci:

public function review() 
{ 
    //Select all users which are a Coach AND have appstate = 1 (Just signed up, in review)  
    $users = $this->paginate($this->Users); 
    $users = $this->Users->find('all')->contain(['Coaches'])->where(['Users.usertype'=>'CO', 'Coaches.appstate'=>'1']); 

    $this->set(compact('users')); 
    $this->set('_serialize', ['users']); 
} 
+0

Merci, comment puis-je associer mes tableaux? Qu'est-ce que j'écris dans mes fichiers Model> Entity? –

+0

Si vous avez utilisé cake bake pour générer les modèles basés sur les tables de base de données, il se peut que ce gâteau ait déjà détecté les associations. Je ne suis pas sûr cependant, puisque je pense que le gâteau s'attend à ce que la colonne de coachid dans la base de données d'entraîneurs soit appelée «user_id». Puisque l'identifiant est en fait l'identifiant d'un utilisateur, à partir de la table des utilisateurs. Pour plus d'informations: https://book.cakephp.org/3.0/en/orm/associations.html –

+0

Super, merci je viens de refaire la base de données. Dans les entraîneurs ai-je besoin d'un attribut id en tant que PK ou est-ce que user_id va bien? Quelle est la bonne façon de le faire pour le gâteau? –