7 votes

Comment exécuter manuellement une requête SQL dans CakePHP sans modèle ?

Je suis en train d'écrire une méthode rapide pour importer des utilisateurs d'une ancienne table vers ma nouvelle application gâteau. J'ai importé l'ancienne table des utilisateurs (old_users) dans la base de données de mon application cake. En fait, j'ai besoin de faire un select all à partir de la table old_users, puis de boucler à travers eux et de les ajouter à la nouvelle table users en utilisant quelque chose comme $newuser->create('old_username', 'old_password') ;

Cependant, je ne voulais pas créer un modèle, etc. pour la table temporaire, car cette importation ne sera exécutée qu'une seule fois. La question que je me pose est donc la suivante : comment puis-je faire une sélection de base pour obtenir tous les utilisateurs de cette table à partir d'une méthode cake dans le contrôleur des utilisateurs. Je pensais à quelque chose comme ça :

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

Mais il échoue avec l'erreur :

Appel à une méthode non définie UsersController::getDataSource()

Je ne trouve pas grand chose dans la documentation sur la façon d'interroger une autre table de la base de données (sans modèle) à partir d'un contrôleur.....

Quelqu'un peut-il m'indiquer la bonne direction ?

Merci d'avance

10voto

BadHorsie Points 2955

Pour exécuter manuellement une requête SQL standard dans CakePHP sans modèle, vous pouvez utiliser la commande query sur n'importe quel modèle disponible pour le contrôleur (le modèle utilisé n'a pas d'importance) :

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

CakePHP 1.3 - Modèles

8voto

SamuelDebruyn Points 493

La documentation relative à cette partie est incorrecte. Trouvez le nom de la connexion dans votre database.php et utiliser le code suivant (le mien est par défaut ) :

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

0voto

Oldskool Points 10023

J'ai fait quelque chose de similaire une fois pour une conversion de base de données script pour une base de données non-Cake vers une base de données Cake. Voici quelques extraits de ce script (basé sur CakePHP 1.3, il peut être légèrement différent si vous utilisez 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");
}

0voto

Je n'ai pas eu l'occasion de l'essayer pour l'instant mais le code ci-dessous devrait fonctionner.

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

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

0voto

Inzamam Arman Points 1

La façon la plus simple de procéder est la suivante :

$model = $this->loadModel('Votre nom de modèle')->query("SELECT * FROM Table name")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X