2011-09-16 6 views
0

私はKohana 3.0を使用しています。私の仕事はデータをデータベースに挿入することです。問題は、その中に複数の項目を挿入する必要があることです(つまり、未処理のSQLに複数のクエリがあるため)。フィールドproject_idamountおよびfinanciers(これは配列です)は、$_POSTからです。コントローラでKohana ORMを使用してデータベースに複数のエントリを挿入する方法は?

私はこのような何かを持っている:私は私のORMモデルにsave_many()というメソッドを作成している

$model_for_financiers->values($_POST); 

$model_for_financiers->save_many(); 

を。

public function save_many() { 

    foreach ($this->financiers as $financier_id) { 

     $this->created_at = time(); 
     $this->amount  = $this->amount * 100; 

     $this->financier_id = $financier_id; 

     $this->save(); 

     $this->reset(); 

    } 

} 

...無視された列としてfinanciersが追加されました。

(私はそれらを呼び出す必要があるか、どのように?)2人の、不要な振る舞いがあります。私のコードで:最後のエントリのみがデータベースに挿入されている

  1. financiersしているどのように多くのIDは問題ではありません。 )、

  2. amountのIDには、financiersのIDが何度も掛けられます。たとえば、その配列に2つのIDがある場合は、100 '(最後の2つは不要です)と掛け合わせます。

私はこれを手伝ってもらえますか?アドバイスをありがとう。

編集:

ここでは私の第二の考えが来ます。手短に言えば、コントローラと各回のオブジェクトの新しいインスタンスにループします。

コントローラー:

foreach ($_POST['financiers'] as $financier_id) { 

    $model_for_financiers = ORM::factory('Vcn_Project_Financier'); 

    $model_for_financiers->values(array(
     'amount'  => $_POST['amount'], 
     'project_id' => $project_id, 
     'financier_id' => $financier_id 
    )); 

    if ($model_for_financiers->check()) { 

     $model_for_financiers->save(); 

    } 

} 

モデル:私は私が持っている任意の変数をvar_dump()しようとすると、

public function save() { 

    $this->created_at = time(); 
    $this->amount  = $this->amount * 100; 

//  $this->reset(); 

    parent::save(); 

} 

私は本当に、何のF * ckのを知っているが、モデルのsave()ではありませんvalues()に渡され、NULLと表示されます。良いニュースは、データベースに正しい数のエントリを挿入するようになったことです。悪いニュース:values()に渡されたデータはすべて空です。

ここに本当に感謝します。 :)

編集#2:

ない作業を行い第三ソリューション。:(

コントローラー:

$model_for_financiers = ORM::factory('Vcn_Project_Financier'); 

$model_for_financiers->save_many($_POST['amount'], $_POST['financiers'], $project_id); 

モデル:

public function save_many($amount, $financiers, $project_id) { 

    foreach ($financiers as $financier_id) { 

     $this->values(array(
      'amount'  => $amount, 
      'financier_id' => $financier_id, 
      'project_id' => $project_id 
     )); 

     if ($this->check()) { 

      $this->created_at = time(); 
      $this->amount  = $amount * 100; 

      $this->save(); 

     } 

     $this->reset(); 

    } 

} 

それは1つのエントリのみを挿入し、溶液#2のようにvalues()に渡されたものをすべて無視起こる

何。 ?

答えて

2

モデルは1行のデータのみを表し、ORM i全体そのコンセプトに基づいて構築されています。複数の結果を保存したい場合は、使用しているメソッドの中に新しいオブジェクトをインスタンス化する必要があります。$ thisを使用しないでください(1回だけ行が作成され、 'save()を使用しています)。

ので:

foreach ($whatevers as $data) 
{ 
    $row = new Model_Whatever; 

    $row->values($data)->create(); 
} 

そして、あなたは(あなたが:)の前にいることをしなかった場合は、おそらくすぐにそれをデバッグしたい)厳格なものとORM::create()を使用して試してみて、ORM::update()の代わりに、保存してください。

編集:おっと、私は事実を見落として申し訳ありません、あなたがKohanaの3.0ので、ノーupdate()create()分離を使用している:)

+0

ありがとう、この**本当に**助け! :) Kohanaを助けることができるあなたのようなものは、それほどたくさんありません。 :( – daGrevis

0

を私はORMクラス内の1つのメソッドを呼び出すことによって、複数のエントリを追加する方法を方法を見つけました。コントローラーなどのループがありません。:)

/** 
* Tries to save multiple entries into the database. If there are problems 
* with validation, method won't save current entry in the database (entries 
* before will be saved) and will stop itself by returning `false`. 
* 
* @param array Data (for example, `$_POST`) 
* @return boolean Success? 
*/ 
function try_to_save_many($data) { 

    foreach ($data['people'] as $person_id) { 

     $this->clear(); 

     $this->member_id = $person_id; 
     $this->project_id = $data['project_id']; 

     if ($this->check()) { 

      $this->save(); 

     } else { 

      return false; 

     } 

    } 

    return true; 

} 

P.S.多分それは正しい方法ではなく、ORMはそのようなもののために設計されていませんが、私はそれを行う必要がありました。早くやれよ。 :D

関連する問題