web-dev-qa-db-ja.com

CakePHP 3 Raw SQLクエリ

CakePHP 3を使用していますが、複数のテーブルで生のSQLクエリを実行する必要があります。 CakePHP 2では、これは任意のモデル($this->Messages->query("select.."))でquery()メソッドを使用することで実行できます。

CakePHP 3でSQLクエリを実行できるメソッドが必要です。使用しているコードスニペットは次のとおりです。

$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); ??

私がこの情報を見つけることができるCakePHP 3モデルのドキュメントへのリンクを提供できれば、それも役に立ちます。私はグーグルで検索を試みましたが、CakePHP 2に関連する質問しか見つけることができませんでした。

12
Ananth

まず、ConnectionManagerを追加する必要があります。

use Cake\Datasource\ConnectionManager;

次に、次のように接続を取得する必要があります。

// my_connection is defined in your database config
$conn = ConnectionManager::get('my_connection');

詳細: http://book.cakephp.org/3.0/en/orm/database-basics.html#creating-connections-at-runtime

その後、次のようなカスタムクエリを実行できます。

$stmt = $conn->execute('UPDATE posts SET published = ? WHERE id = ?', [1, 2]);

詳細: http://book.cakephp.org/3.0/en/orm/database-basics.html#executing-queries

これで、次のように行をフェッチする準備ができました。

// Read one row.
$row = $stmt->fetch('assoc');

// Read all rows.
$rows = $stmt->fetchAll('assoc');

// Read rows through iteration.
foreach ($rows as $row) {
    // Do work
}

詳細: http://book.cakephp.org/3.0/en/orm/database-basics.html#executing-fetching-rows

25
Tijme

このドキュメントはこちらです http://book.cakephp.org/3.0/en/orm/database-basics.html#executing-queries

しかし、書かれていないのはそれを実行する方法です。しばらく時間がかかるので、その解決策を次に示します。

1.追加する必要があります

use Cake\Datasource\ConnectionManager;

2. ConnectionManagerを初期化します(上記のとおり)。

$conn = ConnectionManager::get('my_connection');

3.次のようなものでSQLを実行します

$firstName = $conn->execute('SELECT firstname FROM users WHERE id = 1');
12
Tobias Gaertner

質問はすでに非常に古いですが、私はまだそれを頻繁に見つけます。これは、CAKEPHP 3.6と(省略形)の新しいPHPバージョンのソリューションです。

接続名がまったくわからない場合があるため、ConnectionManager get関数を使用する必要はなく、多くの場合意味がありません。すべてのテーブルには、getConnection()で取得できる/接続があります。

すでにメッセージテーブル(_src/Model/Table/MessagesTable.php_)にいる場合は、接続を使用するだけです。

_$con = $this->Messages->getConnection();
_

あなたがそこにいない場合(あなたのコードがTableRegistry::get()を使って示唆することになる)、あなたはこのテーブルでもそれを行うことができます

_// $aumTable is declared in question
$con = $aumTable->getConnection();
_

次に、上記のようにRAWクエリを実行できます。

_$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