2
votes

Laravel DB: select () requiert toutes les colonnes du groupe par

J'ai besoin d'exécuter une requête personnalisée et j'ai essayé toutes ces méthodes

DB::select($sql);

DB::raw($sql);

DB::select(DB::raw($sql));

//even with pdo 
$sth = DB::getPdo()->prepare($sql);
$sth->execute();
$data = $sth->fetchAll(\PDO::FETCH_OBJ);

 PDOException (42000)
SQLSTATE[42000]: Syntax error or access violation: 1055 'mydatabase.acd.call_ref' isn't in GROUP BY

throws

Illuminate \ Database \ QueryException (42000) SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 'mydatabase.acd.call_ref' n'est pas dans GROUP BY (SQL: ....)

$sql = "SELECT acd.*, DATE_FORMAT(acd.cdate, '%d/%m/%Y') cdate_disp,
  GROUP_CONCAT(CONCAT_WS(', ', car.type, car.session, crd.name) SEPARATOR '<br />') rd_names,
  acb.booking_status my_booking_status
FROM app_data acd
INNER JOIN crmaccounts ca ON ca.id = acd.client_crm_id
LEFT JOIN crmaccount_rdids car ON car.account_id = ca.id
LEFT JOIN crmrd_ids crd ON crd.id = car.rd_id
LEFT JOIN app_bookings acb ON acb.call_ref_id = acd.call_ref AND acb.user_id = 12391
WHERE 1=1 
AND acd.client_crm_id NOT IN (select account_id from bstaff WHERE user_id=12391)
GROUP BY acd.id
ORDER BY acd.cdate, ctiming";

DB:select($sql);

Il semble que la seule façon de travailler est de lister toutes les colonnes du tableau dans le groupe par , ce qui est faisable mais pas pratique.

Je suis capable d'exécuter la même requête directement dans le phpmyadmin. Donc je ne sais pas pourquoi quand je l'exécute via Laravel, il me demande d'ajouter toutes les colonnes.

J'ai MariaDB installé et Laravel et PhpMyAdmin se connectent à la même instance. La version Larvel est la 5.8.5.

Veuillez jeter un œil à la requête complète car j'ai posé la question ici aussi mais je n'ai trouvé aucune réponse - https://laracasts.com/discuss/channels/eloquent/query-runs-ok-in -phpmyadmin-but-dbselect-throws-exception


3 commentaires

Essayez de désactiver le mode strict dans config / database.php dans la section de connexion mysql.


@dparoli - Oui !!! qui laisse la requête s'exécuter! Quels sont les inconvénients de la désactivation de strict? J'ai besoin de comprendre son impact. Ou puis-je simplement le désactiver avant d'exécuter cette requête et l'activer par programme?


vous pouvez trouver ce qui est activé en mode strict dans le code source, recherchez ici: Illuminate / Database / Connectors / MySql Connector.php


3 Réponses :


10
votes

Vous devriez essayer de désactiver le mode strict dans config / database.php , dans la section de connexion mysql.


1 commentaires

Comme vous avez été le premier à le signaler, j'ai accepté votre réponse. Je vous remercie.



0
votes

Ce n'est pas un problème Laravel, mais une limitation logique par MySQL. Lorsque vous ajoutez à votre ensemble de résultats des colonnes qui ne figurent pas dans la clause GROUP BY , différentes valeurs peuvent être possibles pour ces colonnes dans l'ensemble de résultats.

Lors de l'exécution de requêtes en mode strict (qui est activé par défaut), MySQL ne le permettra pas car cela pourrait conduire à des résultats inattendus. Si vous désactivez le mode strict, MySQL utilisera le premier résultat qu'il trouve pour ces colonnes.

Vous pouvez désactiver le mode strict dans vos fichiers de configuration Laravel dans config / database.php . Cependant, il est recommandé de modifier votre requête à la place en raison de l'imprévisibilité.

Une liste complète des contrôles en mode strict se trouve dans la documentation MySQL: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict


0 commentaires

0
votes

J'ai installé Laravel 4.8 et également configuré Auth. de plus, j'ai ajouté deux tables appelées rôle et états et j'ai essayé votre code pdo - cela fonctionne parfaitement pour moi! Ici, j'ai mis mon code.

$sql = "SELECT * 
            FROM users u
            INNER JOIN roles r ON r.id = u.role_id
            LEFT JOIN states s ON s.id = u.state_id

            WHERE 1=1 

            GROUP BY u.id
            ORDER BY u.id ";

    $sth = DB::getPdo()->prepare($sql);
    $sth->execute();
    $data = $sth->fetchAll(\PDO::FETCH_OBJ);

    dd($data);

J'ai hâte de savoir quelle est votre structure db.


4 commentaires

J'utilise Laravel 5.8.5 et il existe une valeur de configuration qui active le mode strict. Peut-être que dans Laravel 4.8, le mode strict est désactivé ou il n'y en a pas?


J'ai vérifié avec config / database.php et j'ai trouvé que c'était vrai par défaut. vous pouvez vous enregistrer dans le fichier 'connection => mysql => strict'


Oui, j'ai stricte mis à vrai.


True est un défaut pour moi donc je suppose que vous l'avez aussi