2012-11-07 7 views
6

Piszę metodę szybkiego wyrzucania, aby zaimportować użytkowników ze starego stołu do mojej nowej aplikacji do ciast. Zaimportowałem tabelę starych użytkowników (old_users) do mojej bazy danych plików cookie. Zasadniczo muszę po prostu zrobić zaznaczenie wszystkich z tabeli old_users, a następnie przepuść je i dodaj je do tabeli nowych użytkowników, używając np. $ Newuser-> create ("old_username", "old_password");Jak ręcznie wykonać zapytanie SQL w CakePHP bez modelu

Jednak nie chciałem tworzyć modelu itp. Dla tabeli tymczasowej, ponieważ ten import będzie uruchamiany tylko raz. Moje pytanie brzmi: w jaki sposób mogę dokonać podstawowego wyboru, aby pobrać wszystkich użytkowników z tej tabeli z metody ciastek w kontrolerze użytkowników. Myślałam somehting tak:

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

Ale failswith błąd:

Call to undefined method UsersController::getDataSource()

nie mogę znaleźć dużo w docs na temat zapytań inną tabelę dB (bez modelu) z poziomu sterownika ...

Czy ktoś może wskazać mi właściwy kierunek?

góry dzięki

Odpowiedz

7

Aby ręcznie uruchomić standardowego zapytania SQL w CakePHP bez modelu, można użyć metody query w każdym modelu, który jest dostępny do kontrolera (nie ma znaczenia, który model używasz):

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

CakePHP 1.3 - Models

+0

Ale co jeśli chcę użyć wyrażenia "JOIN" w zapytaniu? Chcę zadzwonić do wielu modeli. – Kunok

+0

@Kunok Ta metoda pozwala ci tylko napisać surowe zapytanie SQL - możesz wstawić, jeśli chcesz, to nie ma znaczenia. Jeśli chcesz używać rzeczywistych modeli ORM w swojej aplikacji Cake, nie chcesz używać tej metody. Przeczytaj dokumentację o narzędziu do tworzenia zapytań do Cake i jak dołączyć do powiązanych danych. – BadHorsie

0

Zrobiłem coś podobnego raz na skrypt konwersji bazy danych dla non-DB ciasto na ciasto jednego. Oto kilka bitów tego skryptu (opartych na CakePHP 1.3, może być nieco inaczej, jeśli użyjesz 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

Dzięki za odpowiedź, tak, że na zewnątrz z masłem? Chodzi o to, że naprawdę muszę to zrobić w kontrolerze, ponieważ muszę mieć możliwość tworzenia użytkowników dla celów autoryzacji i ACL, a także mieszania hasła. –

0

Nie masz szansy na wypróbowanie go teraz, ale kod powinien zadziałać.

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

Dzięki, ale jako że kontroler nie ma modelu, otrzymuję to: Błąd: Wywołanie kwerendy funkcji składowej() na obiekcie innym niż obiekt –

8

dokumentacja o tej części jest nieprawidłowy. Znajdź nazwę połączenia w pliku database.php i użyć następującego kodu (kopalnia jest domyślny):

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

dzięki, działa! wszystkie inne przykłady mówią, że używają 'query', które nie działa! [np.] (http://stackoverflow.com/a/18168185/287948) –

+0

Ładne rozwiązanie! Mogę tylko dodać, że również nie można "zakodować" nazwy połączenia, ale napisz '$ this-> useDbConfig'. W moim przypadku było to: '$ datasourceName = $ this-> Chunk_section-> useDbConfig; $ db = & ConnectionManager :: getDataSource ($ datasourceName); ', gdzie' Chunk_section' - jakakolwiek nazwa modelu.Może to być przydatne, jeśli istnieje inne połączenie w localhost i prod. serwer. –