Imbriquer 2 requêtes avec foreach

Imbriquer 2 requêtes avec foreach

par Olivier Valentin,
Nombre de réponses : 6
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles

Bonjour à tous,

je débute dans le dev d'un plugin Moodle, et je bute sur une requête un peu particulière.

J'ai deux tables : mdl_message et mdl_colonne. Les messages sont enregistrés avec un ID automatique dans mdl_message, avec en plus un champ colonneid, qui renvoit à l'ID automatique de la table mdl_colonne. Chaque message n'appartient qu'à une seule colonne.

J'essaye de monter une requête pour récupérer un objet listant toutes les colonnes de l'activité, et pour chacun de ces colonnes l'ensemble des billets. J'ai l'impression que cela fonctionne, mais Moodle m'affiche tout de même des erreurs de type "Warning: Creating default object from empty value in MON_FICHIER at line XXX", et je me retrouve avec des "étages" en plus dans mon objet final.

Actuellement voilà le code que je produis :

//requête de liste des colonnes
$colonnes = $DB->get_records('mdl_colonne', array(mes_conditions));
$allcols = array();

foreach ($colonnes as $col) {
  /// pour chaque colonne, je fais une requête récupérant les messages
    $messages = $DB->get_records('mdl_message', array('colonneid' => $col->id);
    $allmessages = array();
    
    foreach ($messages as $message) {
///cette partie me permet de construire mes DIV avec un id propre
        $message->elementid = 'element'.$message->id;
        $allmessages[] = (array)$messages;
    }
    $messagesparcolonne->allmessages = $allmessages;
    $allcols[] = (array)$messagesparcolonne;
}

$toutleresultat->allcols = $allcols;

A ce stade, lorsque je fais un print-object de $toutleresultat, j'obtiens le résultat ci-dessous.
Les deux alertes d'erreur m'indiquent des soucis aux lignes "$messagesparcolonne->allmessages = $allmessages;" et "$toutleresultat->allcols = $allcols;". C'est-à-dire au moment de l'affectation des objets...


stdClass Object
(
    [allcols] => Array
        (
            [0] => Array
                (
                    [allmessages] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 1
                                    [userid] => 45464
                                    [message] => Note 1 col 1
                                )

                            [1] => Array
                                (
                                    [id] => 2
                                    [userid] => 45464
                                    [message] => Note 2 Col 1
                                )

                        )

                )

            [1] => Array
                (
                    [allnmessages] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 3
                                    [userid] => 45464
                                    [message] => Note 1 Col 2
                                )

                        )

                )

        )

)

Ce que je cherchais est plus simple... Dans mon idée, ce que je devais récupérer, c'était quelque chose comme :

stdClass Object
(
colonne1 => Array
(
[0] => Array
(
[id] => X
[userid} => X
)
[1] => Array
(
[id] ....
)
)
colonne2 => Array
(
etc...
)
)

Quelqu'un aurait-il une idée ? Estc-e seulement faisable ??

Merci d'avance !

Olivier

Moyenne des évaluations  -
En réponse à Olivier Valentin

Re: Imbriquer 2 requêtes avec foreach

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
Re-bonjour,
un début de réponse peut-être. J'ai poussé ma programmation jusqu'au bout, et notamment pour l 'affichage à l'aide d'une page Mustache. Tout fonctionne correctement... Donc a priori, l'objet que je récupère semble être ok !
Mais reste la question de ce message d'erreur "Warning: Creating default object from empty value..." que je n'arrive pas à comprendre ! Est-ce une erreur de programmation de ma part, ou y a-t-il une autre raison ? Certains messages évoquent un paramétrage PHP, mais là j'avoue que je suis perdu...
Olivier
En réponse à Olivier Valentin

Re: Imbriquer 2 requêtes avec foreach

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
Re-re,
trouvé !
En fait, mes objets finaux de récupération des boucles n'étaient pas précédés d'un new StdClass. Une fois créés, les messages ont disparus, et ma requête est donc ok ! sourire

Plus précisément, ce sont les deux éléments finaux, $messagesparcolonne et $toutleresultat qui posaient souci. Il suffait de rajouter :

    }
$messagesparcolonne = nex StdClass;
    $messagesparcolonne->allmessages = $allmessages;
    $allcols[] = (array)$messagesparcolonne;
}
$toutleresultat = nex StdClass;
$toutleresultat->allcols = $allcols;
Olivier
Moyenne des évaluations Utile (2)
En réponse à Olivier Valentin

Re: Imbriquer 2 requêtes avec foreach

par Nicolas Martignoni,
Avatar Développeurs Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Salut Olivier,

Bravo pour l'investigation.

Pour être conforme aux standards de développement de Moodle (ici et ici), je te suggère de renommer tes identifiants en anglais.

Bon WE

Moyenne des évaluations Utile (3)
En réponse à Nicolas Martignoni

Re: Imbriquer 2 requêtes avec foreach

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
Bonjour Nicolas,
j'ai vu effectivement la page des standards qui indique bien de coder de préférence en anglais ! J'avais juste traduit en français pour mieux s'y retrouver dans mon exemple. Mine de rien d'ailleurs, en tant que débutant, ça m'a aidé un instant de réécrire en français pour mieux me situer. Mais je prends bien garde de translate en ingliche ! sourire
Olivier
En réponse à Olivier Valentin

Re: Imbriquer 2 requêtes avec foreach

par Joseph Rézeau,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Hello Olivier,

Bienvenue dans le monde merveilleux de la programmation en PHP.sourire

Le message d'erreur que tu signales est connu depuis ... l'arrivée de PHP 5.4 en 2012. On trouve plusieurs solutions ici : Creating default object from empty value in PHP?

J'ai souvent recours au site https://stackoverflow.com/ pour ce genre de dépannage. En tout cas je suis content que tu aies trouvé la solution. Attention, une petite erreur d'écriture peut avoir de grandes conséquences en programmation :

$toutleresultat = nex StdClass;

ça devrait être :

$toutleresultat = new StdClass;

et Nicolas a raison, il faut toujours utiliser la langue "normale" en programmation qui est l'anglais.

Moyenne des évaluations Utile (1)
En réponse à Joseph Rézeau

Re: Imbriquer 2 requêtes avec foreach

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
Bonsoir Joseph,
ho oui, la vilaine faute d'orthographe... tapé trop vite ! triste
En tant que grand débutant (après avoir abandonné le dev pendant 10 ans), j'ai été embêté par cette erreur car je ne comprenais en effet plus s'il venait de mon code mal écrit ou d'un paramétrage sur lequel je n'avais pas la main. Au final, mon erreur est un peu un mix des deux : un code non conforme aux impératifs PHP.
On va voir la suite des événements, je ne pense pas qu'il s'agisse de mon dernier message sur ce forum...
Ca me manquait de m'arracher les cheveux pendant des jours à cause d'un point-virgule manquant ! :D
Olivier