2012-11-07 11 views
6

Sto scrivendo un metodo rapido per importare utenti da un vecchio tavolo alla mia nuova applicazione per dolci. Ho importato la vecchia tabella utenti (old_users) nella mia app torta db. Fondamentalmente ho bisogno di fare solo una selezione all form dalla tabella old_users, quindi passarli in loop e aggiungerli alla nuova tabella utenti usando somehting come $ newuser-> create ('old_username', 'old_password');Come eseguire manualmente la query SQL in CakePHP senza un modello

Tuttavia, non volevo creare un modello ecc. Per la tabella temporanea in quanto questa importazione verrà eseguita solo una volta. Quindi la mia domanda è: come posso fare una selezione di base per ottenere tutti gli utenti da questa tabella da un metodo di torta all'interno del controller degli utenti. Stavo pensando somehting come questo:

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

Ma failswith l'errore:

Call to undefined method UsersController::getDataSource()

non posso trovare molto nella documentazione su come interrogare un altro tavolo db (senza un modello) dall'interno di un controllore ....

Qualcuno potrebbe indicarmi la giusta direzione?

Grazie in anticipo

risposta

7

Per eseguire manualmente una query SQL standard in CakePHP senza un modello, è possibile utilizzare il metodo query su qualsiasi modello che è disponibile per il controller (non importa quale modello si utilizza):

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

CakePHP 1.3 - Models

+0

Ma cosa succede se voglio usare 'JOIN' nella query? Voglio chiamare più modelli – Kunok

+0

@Kunok Questo metodo ti consente solo di scrivere una query SQL raw - puoi inserire un join se lo desideri, non importa. Se si desidera utilizzare i modelli ORM effettivi nell'app Cake, non si desidera utilizzare questo metodo. Leggi la documentazione sul builder di query di Cake e su come unire i dati associati. – BadHorsie

0

ho fatto qualcosa di simile, una volta per uno script di conversione di database per un non-Cake DB ad una torta di uno. Ecco alcuni bit di quello script (basato su CakePHP 1.3, potrebbe essere leggermente diverso se si utilizza 2.x).

-
+0

Grazie per la risposta, in modo che è al di fuori della torta? La cosa è che ho bisogno di farlo davvero all'interno di un controller in quanto ho bisogno di essere in grado di creare gli utenti per scopi Auth e ACL, insieme con l'hashing della password. –

0

Non ho alcuna possibilità di provarlo ora ma sotto il codice dovrebbe funzionare.

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

Grazie, ma siccome quel controller non ha un modello, ottengo questo: Errore: chiamata a una funzione membro query() su un non oggetto –

8

La documentazione di quella parte non è corretto. Trovare il nome della connessione nel file database.php e utilizzare il seguente codice (il mio è predefinito):

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

grazie, sta funzionando! tutti gli altri esempi dicono di usare 'query' che non funziona! [ex.] (http://stackoverflow.com/a/18168185/287948) –

+0

Bella soluzione! Posso solo aggiungere che è anche possibile non scrivere il nome della connessione "hardcode", ma scrivere '$ this-> useDbConfig'. Nel mio caso era: '$ datasourceName = $ this-> Chunk_section-> useDbConfig; $ db = & ConnectionManager :: getDataSource ($ datasourceName); ', dove' Chunk_section' - qualsiasi nome di modello.Può essere utile, se c'è una connessione diversa in localhost e prod. server. –

Problemi correlati