2013-05-27 43 views
0

我试图从一个表复制多个行到另一个,但它只保存我选择的最后一个条目。当我打印所有显示的数据时。我正在复制的表没有设置auto_increment,这是我为什么猜测,所以现在我感到困惑。CakePHP没有正确保存条目

foreach($this->request->data['Order']['archive_value'] as $orderid){ 
    $data = $this->Order->query("select * from orders where orderid = '$orderid'"); 
    $newdata = array(
     'ArchivedOrder' => array(
       'orderid' => $data[0]['orders']['orderid'], 
       'id' => $data[0]['orders']['id'], 
       'order_status' => $data[0]['orders']['order_status'], 
       'email' => $data[0]['orders']['email'], 
       'total' => $data[0]['orders']['total'], 
       'fullName' => $data[0]['orders']['fullName'], 
       'address' => $data[0]['orders']['address'], 
       'city' => $data[0]['orders']['city'], 
       'state' => $data[0]['orders']['state'], 
       'zip' => $data[0]['orders']['zip'], 
       'created' => $data[0]['orders']['created'], 
       'modified' => $data[0]['orders']['modified'] 
     )); 
     print_r($newdata); //this shows every entry that I look up, but it's not saving them properly 
     $this->loadModel('ArchivedOrder'); 
     $this->ArchivedOrder->save($newdata); 
     ///$this->Order->query("delete from orders where orderid = '$orderid'"); 
} 

当我的phpMyAdmin转储表的结构这是显示

CREATE TABLE `archived_orders` (
    `orderid` int(10) default NULL, 
    `id` int(10) default NULL, 
    `order_status` varchar(20) default NULL, 
    `email` varchar(50) default NULL, 
    `total` varchar(50) default NULL, 
    `fullName` varchar(60) default NULL, 
    `address` varchar(50) default NULL, 
    `city` varchar(50) default NULL, 
    `state` varchar(50) default NULL, 
    `zip` varchar(15) default NULL, 
    `created` datetime default NULL, 
    `modified` datetime default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

回答

3

每CakePHP的书here

当调用保存在一个循环中,不要忘了调用create()。

也可能不是一个好主意,在foreach循环中执行loadModel

// load the model 

// foreach loop 

    // build the data 
    $this->ArchivedOrder->create(); 
    $this->ArchivedOrder->save($newdata); 

    //... 
+0

没有工作。我最终只是使用$ this-> ArchivedOrder-> query(“insert into ...”)来使它工作。 – user1443519

+0

@ user1443519 - 不要使用“insert into ...”学会先使用Cake正确的方法。 – Dave

0

有多种问题与代码

  • 不要使用查询()... SQL注入未来,你的代码是不安全的,你失去的数据库抽象。使用find()。
  • 不是一个问题,但是... print_r的 - 有调试()由CakePHP的,它比普通的print_r
  • 不要使用保存()好很多,用白水(),读that page。无需将数据保存到一个循环,代码的
  • 90%要到模型不是在一个控制器
+0

你能指定模型中应该做什么吗?仅仅说“90%”并不是很有帮助。 – user1443519

0

授予您的OrdersController

$newdata = array(); 
foreach($this->request->data['Order']['archive_value'] as $orderid){ 
    $data = $this->Order->find('all',array('conditions'=>array('orderid'=>$orderid))); 
    if(count($data) > 0){ 
    $newdata[] = array(
     'ArchivedOrder' => array(
       'orderid' => $data[0]['Order']['orderid'], 
       'id' => $data[0]['Order']['id'], 
       'order_status' => $data[0]['Order']['order_status'], 
       'email' => $data[0]['Order']['email'], 
       'total' => $data[0]['Order']['total'], 
       'fullName' => $data[0]['Order']['fullName'], 
       'address' => $data[0]['Order']['address'], 
       'city' => $data[0]['Order']['city'], 
       'state' => $data[0]['Order']['state'], 
       'zip' => $data[0]['Order']['zip'], 
       'created' => $data[0]['Order']['created'], 
       'modified' => $data[0]['Order']['modified'] 
     )); 
    } 


} 
if(count($newdata) > 0){ 
     $this->loadModel('ArchivedOrder'); 
     print_r($newdata); //this shows every entry that I look up, but it's not saving them properly 
     foreach($newdata as $order): 
     $this->ArchivedOrder->id = $order['ArchivedOrder']['id']; 
      if($this->ArchivedOrder->exists()){ 
       echo 'Entered Already'; 
      }else{ 
       $this->ArchivedOrder->create(); 
       if($this->ArchivedOrder->save($order)){ 

       }else{echo 'error'; return false;} 
      } 
     endforeach; 
} 
unset($newdata);