J'utilise CakePHP 3, j'ai besoin d'exécuter une requête SQL brute sur plusieurs tables. Dans CakePHP 2, cela pourrait être fait en utilisant la méthode query () sur n’importe quel modèle ($this->Messages->query("select..")
).
J'ai besoin de la méthode qui me permet d'exécuter une requête SQL dans CakePHP 3. Voici l'extrait de code que j'utilise:
$aumTable = TableRegistry::get('Messages');
$sql = "SELECT (SELECT COUNT(*) FROM `messages`) AS `Total_Count`,
(SELECT COUNT(*) FROM `messages_output`) AS `Total_Output_Count`,
(SELECT COUNT(*) FROM `messages_output` WHERE `is_success`=1) AS `Total_Successful_Output_Count`,
(SELECT COUNT(*) FROM `messages_output` WHERE `is_success`=0) AS `Total_Error_Output_Count`,
(SELECT COUNT(*) FROM `users`) AS `Total_User_Count`;";
// to run this raw SQL query what method should i use? query() doesn't work..
// $result = $aumTable->query($sql); ??
// $result = $aumTable->sql($sql); ??
Si vous pouvez fournir des liens vers la documentation de modèle de CakePHP 3 où je peux trouver cette information, cela serait également utile. J'ai essayé de chercher sur Google mais je n'ai trouvé que des questions relatives à CakePHP 2.
Vous devez d’abord ajouter le ConnectionManager:
use Cake\Datasource\ConnectionManager;
Ensuite, vous devez obtenir votre connexion comme suit:
// my_connection is defined in your database config
$conn = ConnectionManager::get('my_connection');
Plus d'infos: http://book.cakephp.org/3.0/fr/orm/database-basics.html#creating-connections-at-runtime
Après cela, vous pouvez exécuter une requête personnalisée comme ceci:
$stmt = $conn->execute('UPDATE posts SET published = ? WHERE id = ?', [1, 2]);
Plus d'infos: http://book.cakephp.org/3.0/fr/orm/database-basics.html#executing-queries
Et puis vous êtes prêt à récupérer la ou les lignes comme ceci:
// Read one row.
$row = $stmt->fetch('assoc');
// Read all rows.
$rows = $stmt->fetchAll('assoc');
// Read rows through iteration.
foreach ($rows as $row) {
// Do work
}
Plus d'infos: http://book.cakephp.org/3.0/fr/orm/database-basics.html#executing-fetching-rows
La documentation à ce sujet se trouve ici: http://book.cakephp.org/3.0/fr/orm/database-basics.html#executing-queries
Mais ce qui n'est pas écrit, c'est comment l'exécuter. Parce que cela m'a coûté un peu de temps, voici la solution:
1.Vous devez ajouter
use Cake\Datasource\ConnectionManager;
2.init le ConnectionManager (comme mentionné ci-dessus)
$conn = ConnectionManager::get('my_connection');
3.Exécutez votre SQL avec quelque chose comme ça
$firstName = $conn->execute('SELECT firstname FROM users WHERE id = 1');
La question est déjà très ancienne, mais je la trouve toujours fréquemment. Voici une solution pour CAKEPHP 3.6 et (en abrégé) pour les versions plus récentes PHP.
Il n'est pas nécessaire d'utiliser la fonction get de ConnectionManager et cela n'a souvent aucun sens, car le nom de la connexion peut ne pas être connu du tout. Chaque table a sa/une connexion que l'on peut obtenir avec getConnection ().
Si vous êtes déjà dans la table des messages (src/Model/Table/MessagesTable.php
), vous pouvez simplement utiliser la connexion
$con = $this->Messages->getConnection();
Si vous n'êtes pas là (ce que votre code suggérerait avec TableRegistry::get()
, vous pouvez le faire aussi avec cette table
// $aumTable is declared in question
$con = $aumTable->getConnection();
alors vous pouvez exécuter une requête RAW comme indiqué ci-dessus:
$result = $con->execute ();
// short
$result = $this->Messages->getConnection()->execute ('Select * from ...')
// or ($aumTable is declared in question)
$result = $aumTable->getConnection()->execute ('Select * from ...');