2012-11-07 7 views
6

私は古いテーブルから新しいケーキアプリにユーザーをインポートするための簡単な方法を書いています。私は古いユーザーのテーブル(old_users)を私のケーキアプリのデータベースにインポートしました。基本的には、old_usersテーブルをすべて選択してから、それらをループして、$ newuser-> create( 'old_username'、 'old_password')のようなsomehtingを使って新しいユーザテーブルに追加する必要があります。モデルなしでCakePHPでSQLクエリを手動で実行する方法

しかし、このインポートは一度だけ実行されるため、tempテーブルのモデルなどを作成したくありませんでした。だから私の質問は - どのように基本的な選択を行うことができますユーザーのコントローラ内のケーキメソッドからこのテーブルからすべてのユーザーを取得します。私はこのようなsomehtingを考えていた:

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

しかし、それはエラーをfailswith:

Call to undefined method UsersController::getDataSource()

私は(モデルなしで)別のdbテーブルを照会する方法についてのドキュメントで多くを見つけるカントコントローラ内から....

誰かが正しい方向に向いていますか?事前

答えて

7

手動モデルなしではCakePHPにおける標準のSQLクエリを実行するには、あなたが(あなたが使用しているモデルもかまいません)コントローラに利用可能な任意のモデルにqueryメソッドを使用することができます。

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

CakePHP 1.3 - Models

+0

クエリで 'JOIN'を使用したいのですが? – Kunok

+0

@Kunokこのメソッドでは、生のSQLクエリを書くことができます。あなたが好きな場合は、それを入れても問題ありません。 Cakeアプリケーションで実際のORMモデルを使用する場合は、このメソッドを使用しないでください。 Cakeクエリービルダーと関連データを結合する方法についてのドキュメントを読んでください。 – BadHorsie

0

おかげで私はケーキの一つに非ケーキDB用のデータベース変換スクリプトのために一度似た何かをしました。このスクリプトのいくつかのビットがあります(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"); 
} 
+0

ありがとう: (私はデフォルトである)あなたのdatabase.phpでファイルに接続の名前を検索し、次のコードを使用できますか?パスワードをハッシュするだけでなく、AuthやACLの目的でユーザーを作成する必要があるため、コントローラ内で実際に行う必要があります。 –

0

今すぐ試す機会はありませんが、下のコードが動作するはずです。

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

ありがとうございますが、そのコントローラはモデルを持っていませんでした。 エラー:非オブジェクトのメンバ関数query()を呼び出す –

8

その部分に関するドキュメントが間違っています。そのケーキの外で、答えを

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

ありがとうございました!他のすべての例では動作しない 'query'を使うと言います! [ex。](http://stackoverflow.com/a/18168185/287948) –

+0

ニースの解決策!私は接続名を "ハードコード"するのではなく、 '$ this-> useDbConfig'と書くことも可能です。私の場合、それは: '$ datasourceName = $ this-> Chunk_section-> useDbConfig; $ db =&ConnectionManager :: getDataSource($ datasourceName); '、ここで' Chunk_section' - 任意のモデル名です。localhostとprodに異なる接続がある場合は、便利です。サーバ。 –

関連する問題