Bonjour,

Voila je rencontre un petit problème avec mon code. Enfin plutôt je m'interroge sur la façon de faire.

Ce que je fais

J'ai une table "Users" avec une colonne role_id et une contrainte de clé étrangère fk_role_id sur la colonne "id" de la classe "Roles".

alter table users add FOREIGN KEY fk_role_id (role_id) REFERENCES roles(id);

Ce que je veux

Je cherche donc a obtenir le nom du role associé à mon user, donc depuis le controller users.
Et je ne comprends pas quel type d'association mettre en place. Pour moi c'est du hasOne. Mais je n'y arrive pas.

Ce que j'obtiens

Pour le moment RIEN...

5 réponses


romses
Réponse acceptée

Voici comment proceder déjà tu peux faire du hasOne ainsi
users(id,role_id,...)
role(id,role_name)

créer le fichier Model/Table/RolesTable.php puis ajouter ce qui suit

<?php

use Cake\ORM\Table;
use Cake\Validation\Validator;
class RolesTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('roles');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');

        $this->hasOne('Users', [
            'foreignKey' => 'role_id'
        ]);
    }

    public function validationDefault(Validator $validator)
    {

        $validator

            ->notEmpty('nom_role', __("Le role est obligatoire."))
            ->add('nom_role', [
                'unique' => [
                    'rule' => 'validateUnique',
                    'provider' => 'table',
                    'message' => __("Ce nom de role est déjà créer.")
                ]
            ])  

            ->requirePresence('nom_role', 'create');

        return $validator;
    }
}

créer le fichier Model/Entity/Role.php puis ajouter ce qui suit

<?php
use Cake\ORM\Entity;
class Role extends Entity
{

    protected $_accessible = [
        '*' => true,
        'id' => false
    ];
}

créer le fichier Model/Entity/User.php puis ajouter ce qui suit

<?php
use Cake\ORM\Entity;
class User extends Entity
{

    protected $_accessible = [
        '*' => true,
        'id' => false
    ];
}

créer le fichier Model/Table/UsersTable.php puis ajouter ce qui suit

<?php
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class UsersTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('users');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');
        $this->addBehavior('Timestamp');

        $this->belongsTo('Roles', [
            'foreignKey' => 'role_id',
            'joinType' => 'INNER'
        ]);
    }

    public function validationDefault(Validator $validator)
    {

        $validator
            ->requirePresence('login', 'create')
            ->notEmpty('login', __("Le login est obligatoire."))
        return $validator;
    }

    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->existsIn(['role_id'], 'Roles'));

        return $rules;
    }
}

dans le controller Controller/UsersController.php

tu peux avoir tous les utilisateurs avec leurs role directement

public function mafonction()
{
    $userasrole = $this->Users->find()->contain(['Roles'])->all();
}

Bonjour.
Est-ce que tu as consulté sur la documentation de CakePHP ?
Car c'est très bien expliqué dessus.

squeeze
Auteur

Oui j'ai lu https://book.cakephp.org/3.0/fr/orm/associations.html mais alors je ne comprends pas ce que je lis :(
Edit : Bon il a fallu que je spécifie le champs de la table roles qui correspond à ma clé étrangère. Je vais relire ça parce que j'ai pas tout saisi pour le coup...

Bonjour a tous
Je veux demander une chose pour grafikart.fr, je pense, il faut faire quelque tuto pour cakephp3, car il y a beaucoup des chose qui ne sont pas claire malgré la documentation et aussi il y a beaucoup des demande a ca.