Bonsoir à vous,

J'ai du mal à comprendre le principe de model avec cake php. Je m'explique. J'ai une base de donnée où chaque user a un seuil à respecter (montant en euros). il fait plusieurs depenses (dans la bdd on a une table user et depense à part).Cependant je dois piocher dans ma table user en fonction de son id pour recuperer son seuil et afficher un message d'alert si celui-ci est depassé. Mais lorsque je lance une fonction dans ma classe USersTable afin de recuperer le seuil de mon user ```
public static function getSeuilUser($id){

    $user = TableRegistry::get('Users');

    $seuil = $user->find()->select('username')->where(['id' => $id]);

    debug($seuil);

    return $seuil;
}

4 réponses


Lartak
Réponse acceptée

Tu as le choix, soit tu fais une requête plus approfondie depuis le controller, ou alors tu fais un Finder personnalisé dans le model que tu appellera depuis la fonction du controller.
Par exemple pour le second cas :

$seuil = $this->Users->find('seuil')
    ->where(['Users.id' => $this->Auth->user('id')]);
if ($seuil):
    $this->Flash->error('Vous avez dépassé le seuil autorisé');
endif;

Puis dans src/Model/Entity/User.php:

public function findSeuil(Query $query, array $options)
{
    $query
        ->contain(['Depenses'])
        ->where(['Depenses.seuil >' => 5000]);
    return $query;
}

De cette manière, si tu as un retour positif du finder personnalisé, c'est que l'utilisateur a dépassé le seuil autorisé et tu lui affiches le message.
Tu peux très bien te passer de la requête en get que j'ai mise plus haut si tu veux, c'était juste un code vite fait, pour éviter une requête supplémentaire dans le cas ou la première était nulle.
Oui, c'est Finder personnalisé et non Query Builder personnalisé comme j'ai mis dans mon post précédent.

Bonsoir.
Tu effectues la requête sur le controller et le controller va la transmettre au model pour qu'il la traite en communiquant avec la base de données.
Donc, par exemple dans la fonction de ton controller Users, tu fais quelque chose comme :

$user = $this->Users->get($this->Auth->user('id'));
if ($user):
    // Requête plus avancée ou appel à un QueryBuilder personnalisée
endif;

Et puis, pour les Query Builder, c'est en public function et non en public static function.

Bonsoir je te remercie pour ta reponse qui m'a un peu plus eclairé sur le sujet !
Donc si j'ai bien compris dans ton exemple si la condition est vraie je ferai appel à une fonction public de mon model qui va lui faire appel à un query builder ?

Merci pour ta réponse ! bonne soirée !