2012-11-07 14 views
6

Tôi đang viết một phương thức nhanh chóng để nhập người dùng từ một bảng cũ vào ứng dụng bánh mới của tôi. Tôi đã nhập bảng người dùng cũ (old_users) vào db ứng dụng bánh của tôi. Về cơ bản tôi cần phải chỉ cần làm một lựa chọn tất cả các hình thức bảng old_users, sau đó lặp qua chúng và thêm chúng vào bảng người dùng mới bằng cách sử dụng somehting như $ newuser-> create ('old_username', 'old_password');Cách thực hiện truy vấn SQL theo cách thủ công trong CakePHP mà không có mô hình

Tuy nhiên, tôi không muốn tạo mô hình, vv cho bảng tạm thời vì lần nhập này sẽ chỉ chạy một lần. Vì vậy, câu hỏi của tôi là - làm thế nào tôi có thể làm một lựa chọn cơ bản để có được tất cả người dùng từ bảng này từ một phương pháp bánh trong bộ điều khiển người dùng. Tôi đã suy nghĩ somehting như thế này:

public function admin_importOldUsers() { 
     $db = $this->getDataSource(); 
     $db->fetchAll('SELECT * FROM old_users'); 
    } 

Nhưng nó failswith lỗi:

Call to undefined method UsersController::getDataSource()

tôi không thể tìm thấy nhiều trong các tài liệu về cách để truy vấn một bảng db (mà không có một mô hình) từ bên trong một bộ điều khiển ....

Có ai có thể chỉ cho tôi đúng hướng không?

Cảm ơn trước

Trả lời

7

Để tự chạy một truy vấn SQL tiêu chuẩn trong CakePHP mà không có một mô hình, bạn có thể sử dụng phương pháp query trên bất kỳ mô hình có sẵn với bộ điều khiển (nó không quan trọng mà mô hình mà bạn sử dụng):

class MyController extends AppController 
{ 
    public function index() 
    { 
     $result = $this->AnyModel->query("SELECT * FROM my_table"); 
    } 
} 

CakePHP 1.3 - Models

+0

Nhưng điều gì sẽ xảy ra nếu tôi muốn sử dụng 'JOIN'? Tôi muốn gọi nhiều mô hình – Kunok

+0

@Kunok Phương pháp này chỉ cho phép bạn viết truy vấn SQL thô - bạn có thể đặt tham gia nếu bạn muốn, không quan trọng. Nếu bạn muốn sử dụng các mô hình ORM thực tế trong ứng dụng Bánh của mình thì bạn không muốn sử dụng phương pháp này. Đọc tài liệu về Trình tạo truy vấn bánh và cách tham gia dữ liệu được liên kết. – BadHorsie

0

Tôi đã làm điều tương tự một lần cho tập lệnh chuyển đổi cơ sở dữ liệu cho một DB không phải bánh thành Bánh. Dưới đây là một số bit từ tập lệnh đó (dựa trên CakePHP 1.3, có thể hơi khác nếu bạn sử dụng 2.x).

// Require the config/database.php file for DB connection 
require_once(dirname(__FILE__) . '/database.php'); 
$DB = new DATABASE_CONFIG(); 

// Setup the connection 
if($DB->default['driver'] === 'mysqli') { 
    // Connect using MySQLi 
    print "Connecting to database: "; 
    $dbc = new mysqli($DB->default['host'], $DB->default['login'], $DB->default['password'], $DB->default['database']); 

    // Make sure we use UTF8 encoding 
    if($DB->default['encoding'] == "UTF8") { 
     $dbc->set_charset($DB->default['encoding']); 
    } 

    // At this point you can just run raw queries like: 
    $dbc->query("INSERT INTO `groups` (`id`, `name`) VALUES (1, 'Management'), (2, 'Operations')"); 

    // Close the database connection 
    $dbc->close(); 
} else { 
    die("Please use mysqli"); 
} 
+0

Cảm ơn cho câu trả lời, như vậy là bên ngoài của bánh? Thing là tôi cần phải thực sự làm điều đó trong một bộ điều khiển như tôi cần để có thể tạo ra người dùng cho các mục đích Auth và ACL, cùng với băm mật khẩu. –

0

Không có cơ hội để thử ngay bây giờ nhưng dưới mã sẽ hoạt động.

class NoModelsController extends AppController{ 
    var $name="NoModels"; 
    var $uses = null; 

    public function admin_importOldUsers() { 
     $results = $this->Model->query('SELECT * FROM old_users'); 
     pr($results); 
    } 
} 
+0

Cảm ơn nhưng vì bộ điều khiển đó không có mô hình tôi nhận được điều này: Lỗi: Gọi tới truy vấn chức năng thành viên() trên đối tượng không –

8

Tài liệu về phần đó không chính xác. Tìm tên của kết nối trong file database.php bạn và sử dụng đoạn mã sau (tôi là mặc định):

$db = ConnectionManager::getDataSource("default"); // name of your database connection 
$places_of_interest = $db->fetchAll("SELECT * FROM places_of_interest"); 
+0

cảm ơn, đang hoạt động! tất cả các ví dụ khác nói để sử dụng 'truy vấn' không hoạt động! [ví dụ] (http://stackoverflow.com/a/18168185/287948) –

+0

Giải pháp tuyệt vời! Tôi chỉ có thể thêm, cũng có thể không phải là "hardcode" tên kết nối, nhưng viết '$ this-> useDbConfig'. Trong trường hợp của tôi, đó là: '$ datasourceName = $ this-> Chunk_section-> useDbConfig; $ db = & ConnectionManager :: getDataSource ($ datasourceName); ', trong đó' Chunk_section' - bất kỳ tên model nào.Nó có thể hữu ích, nếu có kết nối khác nhau trong localhost và prod. máy chủ. –