2014-10-11 17 views
8

Tôi đang sử dụng CakePHP 3, tôi cần chạy truy vấn SQL thô trên nhiều bảng. Trong CakePHP 2, điều này có thể được thực hiện bằng cách sử dụng phương thức query() trên bất kỳ mô hình nào ($this->Messages->query("select..")).CakePHP 3 Truy vấn SQL thô

tôi cần những phương pháp cho phép tôi để chạy một truy vấn SQL trong CakePHP 3. Dưới đây là đoạn mã Tôi đang sử dụng:

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

Nếu bạn có thể cung cấp các liên kết đến CakePHP 3 tài liệu mô hình nơi tôi có thể tìm thông tin này, điều đó cũng hữu ích. Tôi đã cố gắng tìm kiếm trên google nhưng chỉ có thể tìm thấy những câu hỏi liên quan đến CakePHP 2.

+3

** http: //book.cakephp.org/3.0/en/orm/database-basics.html#managing-connections**> ** h ttp: //book.cakephp.org/3.0/en/orm/database-basics.html#database-queries** – ndm

+0

Cảm ơn bạn. Câu trả lời là: chúng ta cần sử dụng ConnectionManager thay vì TableRegistry để chạy các truy vấn sql thô. – Ananth

Trả lời

21

Trước tiên, bạn cần phải thêm ConnectionManager:

use Cake\Datasource\ConnectionManager; 

Sau đó, bạn cần phải nhận được kết nối của bạn như sau:

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

Thông tin khác: http://book.cakephp.org/3.0/en/orm/database-basics.html#creating-connections-at-runtime

Sau đó, bạn có thể chạy truy vấn tùy chỉnh như sau:

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

thêm: http://book.cakephp.org/3.0/en/orm/database-basics.html#executing-queries

Và sau đó bạn đã sẵn sàng để lấy hàng (s) như thế này:

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

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

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

Thông tin thêm: http://book.cakephp.org/3.0/en/orm/database-basics.html#executing-fetching-rows

9

Các tài liệu cho điều này là ở đây: http://book.cakephp.org/3.0/en/orm/database-basics.html#executing-queries

Nhưng những gì không được viết có cách thực thi. Bởi vì chi phí cho tôi một thời gian, đây là giải pháp cho rằng:

1.You cần thêm

use Cake\Datasource\ConnectionManager; 

2.init các ConnectionManager (như đã đề cập ở trên)

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

3. Execute SQL của bạn với một cái gì đó như thế này

$firstName = $conn->execute('SELECT firstname FROM users WHERE id = 1'); 
+3

// Đọc một hàng. $ row = $ firstName-> fetch ('assoc'); // Đọc tất cả các hàng. $ rows = $ firstName-> fetchAll ('assoc'); // Đọc các hàng thông qua lặp lại. foreach ($ rows as $ row) { // Làm việc } –

+1

Gợi ý hay để hoàn thành công việc này! –

Các vấn đề liên quan