Как вручную выполнить 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()

Я не могу найти много в документах о том, как запросить другую таблицу БД (без модели) из контроллера....

Может ли кто-нибудь указать мне в правильном направлении?

заранее спасибо


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, вам не следует использовать этот метод. Прочтите документацию о построителе запросов 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

Однажды я сделал что-то подобное для сценария преобразования базы данных для базы данных без торта в базу данных для торта. Вот некоторые фрагменты из этого скрипта (на основе 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