2011-09-16 77 views
0

我使用Kohana 3.0,我的任務是在數據庫中插入數據。問題是我需要插入多個條目(所以......在原始SQL中 - 多個查詢)。我有來自$_POST的字段project_idamountfinanciers(這是一個數組)。如何使用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作爲被忽略的列。

有兩個不必要的行爲(或者我應該怎麼稱呼他們?)在我的代碼:

  1. 只有最後一個條目插入到數據庫中(也不要緊多少ID在financiers ),

  2. amountfinanciers中的ID相乘的次數倍增。例如,如果該數組中有兩個ID,它將乘以100'(最後兩個零是不需要的)。

你能幫助我嗎?謝謝你的建議。

編輯:

這纔是我的第二個觀點。簡而言之,在控制器中循環,每次 - 對象的新實例。

控制器:

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(); 

    } 

} 

型號:

public function save() { 

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

//  $this->reset(); 

    parent::save(); 

} 

我真的不知道是什麼他媽的,但在模型的save(),當我嘗試var_dump()我有任何變量傳遞給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(); 

    } 

} 

它插入一個只有一個入口,而忽略傳遞給values()在溶液#2,所有

會發生什麼?

回答

2

模型只表示一行數據和整個ORM i圍繞這個概念構建的。如果你想保存多個結果,你必須在你使用的方法中實例化每個新對象,而不是使用$ this(它只會創建一次行並在每次迭代中更新它,因爲你'使用save())。

所以:

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

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

你應該儘量嚴格要求和使用ORM::create()ORM::update()而不是保存(你可能調試它的時候了,如果你這樣做:)之前)。

編輯:哎呀,對不起,我忽略了你使用的Kohana 3.0的事實,所以沒有update()create()分離:)

+0

謝謝,這**真的**幫助! :)太糟糕了,沒有什麼可以像Kohana那樣幫助Kohana的。 :( – daGrevis

0

我找到了一種方法只是如何通過調用ORM類中的一個方法來添加多個條目。沒有控制器或任何迴路... :)

/** 
* 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

相關問題