Gestion des join sur les tables

Bonjour,
J’ai une petite question, j’arrive bien à faire un join sur différentes tables, mais je n’arrive pas à récupérer mes nouvelles colonnes :

$values = array();
      
      $sql = 'SELECT ' . DB::buildField(__CLASS__, "op") . ' , `bank`.`isEnable` ,  `cat`.`name` ,  `cat`.`image`
          FROM comptes_operations op LEFT OUTER JOIN eqLogic bank ON `op`.`eqLogic_id` = `bank`.`id` LEFT OUTER JOIN comptes_categories cat ON `op`.`CatId` = `cat`.`id`
          WHERE `bank`.`isEnable` = 1';
      
      //si banque selectionnée on la sélectionne
      if ($_BankId != 0)  {
        $sql.= ' AND eqLogic_id = :id ';
        $values['id'] = $_BankId;
      }
      //Si mode de recherche ou de filtre par cat, on adapte la requete
      switch($_mode) {
        case 2:
        $sql.= ' AND `BankOperation` LIKE :_search ';
        $values['_search'] = '%'.$_search.'%';
        break;
        case 1: 
        $sql.= ' AND `CatId` = :_catid ';
        $values['_catid'] = $_catId;
        break;
        case 0:
        default:
        break; 
      }
      
      $sql.= ' ORDER BY `op`.`CheckedOn` DESC LIMIT ';
      $sql.= $_offset;
      $sql.= ',40';
      log::add('comptes', 'debug', 'Requete get ops:  '.$sql);
      
      return DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, __CLASS__);    

Pour moi le problème se situe au niveau du DB::Prepare, le dernier argument CLASS fait que ça ne prend pas mes nouvelles colonnes.
Comment je peux fournir la CLASS plus les nouvelles colonnes paramétrées dans mon join ?

Merci

Bonjour,

Pour moi, tu ne peux pas, il faudrait soit que tu crée la classe qui correspond à ta requête, avec tous les champs +getter + setter, … soit que tu fasse un fetch sur autre chose, donc un array à la place de la classe.

Dans cet esprit de 1 table = 1 classe, j’ai découvert un « entity-generator » qui crée les classes automatiquement à partir de la db. Dans ton cas, ça n’aidera pas puisque tu fais une jointure. Mais si tu crée une vue en base à la place de cette requête, ça marcherait.

bonsoir,
merci pour le retour, j’ai trouvé une méthode qui fonctionne:

//return DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS , __CLASS__); //nécessite le utils::o2a() dans la partie AJAX     
      //return DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL);   //ne nécessite pas le utils::o2a() dans la partie AJAX
      
      //permet d'avoir l'ensemble des colonnes : mais nécessite d'avoir un parse des colonnes contenant du JSON côté Javascript : ne pas utiliser utils::o2a() dans la partie ajax
      $stmt = DB::getConnection()->prepare($sql);
      $stmt->execute($values);
      $res = $stmt->fetchAll();
      
      $errorInfo = $stmt->errorInfo();
      if ($errorInfo[0] != 0000) {
        throw new Exception('[MySQL] Error code : ' . $errorInfo[0] . ' (' . $errorInfo[1] . '). ' . $errorInfo[2] . '  : ' . $sql);
      }
    
      return $res;

Je n’utilise pas la fonction du core, j’ai refait un fetchAll classique sans paramètres.
par contre, côté ajax, il ne faut pas utiliser le utils::o2a et côté javascript si j’ai des colonnes avec du JSON, il faut le reparser, mais pas bien compliqué.

Du coup top, en une requête j’ai toutes mes infos, ça me simplifie le code :slight_smile:

Merci, ça m’a mis sur la piste.
Bonne soirée.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.