web-dev-qa-db-fra.com

Requête SQL brute de CakePHP 3

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.

10
Ananth

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

25
Tijme

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');
12
Tobias Gaertner

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 ...');
0
chriss