Как да изпълните ръчно SQL заявка в CakePHP без модел

Пиша бърз метод за изхвърляне за импортиране на потребители от стара маса в моето ново приложение за торта. Импортирах таблицата на старите потребители (old_users) в моята база данни на приложението за торта. По принцип трябва просто да направя избор на всички от таблицата old_users, след това да ги прегледам и да ги добавя към таблицата с нови потребители, използвайки нещо като $newuser->create('old_username', 'old_password');

Въпреки това не исках да създавам модел и т.н. за временната таблица, тъй като това импортиране ще се изпълнява само веднъж. Така че въпросът ми е - как мога да направя основен избор, за да получа всички потребители от тази таблица от метод на торта в потребителския контролер. Мислех си нещо подобно:

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

Но се проваля с грешката:

Извикване на недефиниран метод UsersController::getDataSource()

Не мога да намеря много в документите за това как да заявя друга db таблица (без модел) от контролер....

Може ли някой да ме насочи в правилната посока?

Благодаря предварително


person James J    schedule 07.11.2012    source източник


Отговори (4)


За да стартирате ръчно стандартна SQL заявка в CakePHP без модел, можете да използвате метода query на всеки модел, който е достъпен за контролера (няма значение кой модел използвате):

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

CakePHP 1.3 - Модели

person BadHorsie    schedule 07.11.2012
comment
Но какво ще стане, ако искам да използвам JOIN в заявката? Искам да се обадя на няколко модела - person Kunok; 16.09.2016
comment
@Kunok Този метод просто ви позволява да напишете необработена SQL заявка - можете да поставите присъединяване, ако желаете, няма значение. Ако искате да използвате действителните ORM модели във вашето приложение Cake, тогава не искате да използвате този метод. Прочетете документацията за конструктора на заявки за торта и как да обедините свързани данни. - person BadHorsie; 16.09.2016

Документацията за тази част е неправилна. Намерете името на връзката във вашия файл database.php и използвайте следния код (моят е по подразбиране):

$db = ConnectionManager::getDataSource("default"); // name of your database connection
$places_of_interest = $db->fetchAll("SELECT * FROM places_of_interest");
person Sam Debruyn    schedule 12.05.2014
comment
благодаря, работи! всички други примери казват да се използва query, което не работи! напр. - person Peter Krauss; 25.05.2015
comment
Хубаво решение! Мога само да добавя, че също така е възможно да не се кодира твърдо името на връзката, а да се напише $this->useDbConfig. В моя случай беше: $datasourceName = $this->Chunk_section->useDbConfig; $db= &ConnectionManager::getDataSource($datasourceName);, където Chunk_section - произволно име на модела. Може да бъде полезно, ако има различна връзка в localhost и prod. сървър. - person Boolean_Type; 23.02.2017

Веднъж направих нещо подобно за скрипт за преобразуване на база данни за база данни, която не е Cake, в Cake. Ето някои части от този скрипт (базиран на CakePHP 1.3, може да е малко по-различен, ако използвате 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");
}
person Oldskool    schedule 07.11.2012
comment
Благодаря за отговора, така че това извън тортата ли е? Работата е там, че наистина трябва да го направя в рамките на контролер, тъй като трябва да мога да създавам потребители за целите на Auth и ACL, заедно с хеширане на паролата. - person James J; 07.11.2012

Нямате шанс да го изпробвате точно сега, но кодът по-долу трябва да работи.

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

    public function admin_importOldUsers() {
        $results = $this->Model->query('SELECT * FROM old_users');
        pr($results);
    }
}
person meaninglessdisplayname    schedule 07.11.2012
comment
Благодаря, но тъй като този контролер няма модел, получавам това: Грешка: Извикване на членска функция query() на не-обект - person James J; 07.11.2012