0

あるテーブルから別のテーブルに複数の行をコピーしようとしていますが、選択した最後のエントリのみが保存されます。データの配列を印刷すると、すべてが表示されます。私がコピーしているテーブルには auto_increment が設定されておらず、それが理由についての私の推測だったので、今は困惑しています。

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;
4

3 に答える 3

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);
于 2013-05-27T22:37:33.033 に答える
0

そのコードには複数の問題があります

  • query() を使用しないでください... SQL インジェクションを先に行うと、コードが安全ではなくなり、データベースの抽象化が失われます。find() を使用します。
  • 問題ではありませんが... print_r - CakePHP による debug() があります。プレーンな print_r よりもはるかに優れています。
  • save() を使用しないで、saveAll() を使用し、そのページを読んでください。ループでデータを保存する必要はありません
  • そのコードの 90% は、コントローラーではなくモデルに入れる必要があります
于 2013-05-27T22:24:06.583 に答える