Jun
30

Lưu nhiều record với CakePHP

Author admin    Category Kinh nghiệm, Manual, Tutorial     Tags ,

Đôi lúc bạn cần phải lưu nhiều record tại một thời điểm submit form, CakePHP hỗ trợ hàm saveAll() để làm việc này, ngoài ra, bạn có thể dùng vòng lặp kết hợp hàm save() tuy nhiên nếu dùng cách này bạn cần phải chú ý tới một chi tiết nho nhỏ nếu không dữ liệu sẽ không được lưu

Thay vì mỗi lần submit form chỉ lưu được 1 danh mục sản phẩm, bây giờ tôi sẽ thiết kế form để có thể lưu đồng thời nhiều danh mục một lúc. Đây là code phần view:

<?php
$num_record = 5;
echo $form->create();
for($i=1;$i<=$num_record;$i++) {
	echo $form->input('name',array('name'=>'data[ProductCategory][][name]','id'=>'id_'.$i));
}
echo $form->end(array('label'=>'Lưu'));
?>

Sau khi nhập thông tin, submit form, dữ liệu trả về có dạng như sau:

Array
(
    [ProductCategory] => Array
        (
            [0] => Array
                (
                    [name] => Cat 1
                )
 
            [1] => Array
                (
                    [name] => Cat 2
                )
 
            [2] => Array
                (
                    [name] => Cat 3
                )
 
            [3] => Array
                (
                    [name] => Cat 4
                )
 
            [4] => Array
                (
                    [name] => Cat 5
                )
 
        )
 
)

1. Dùng saveAll()

saveAll($data = null, $options = array())

$data: dữ liệu cần lưu hoặc kiểm tra
$options: là mảng tùy chọn với 2 key quan trọng là validate và atomic

- validate:

+ false: không kiểm tra dữ liệu nhập vào
+ true: kiểm tra từng dòng dữ liệu trước khi lưu dòng đó
+ first: kiểm tra toàn bộ dữ liệu đưa vào trước khi lưu bất cứ dòng dữ liệu nào (mặc định)
+ only: chỉ kiểm tra dữ liệu, không lưu

- atomic:

+ true: lưu toàn bộ dữ liệu trong một transaction đơn (mặc định)
+ false: để false nếu CSDL không hỗ trợ transaction

Code trong controller:

function add() {
     if(!empty($this->data)) {
          $this->ProductCategory->saveAll($this->data['ProductCategory']);
     }
}

Kiểm tra lại bảng product_categories, dữ liệu đã được lưu vào!

2. Dùng vòng lặp kết hợp hàm save()

- Khi dùng vòng lặp, sau mỗi lần lặp bạn nhớ reset id của record về false, cụ thể trong trường hợp này là:

$this->ProductCategory->id = false;

Code trong controller:

function add() {
	if(!empty($this->data)) {			
		foreach($this->data['ProductCategory'] as $k=>$v){
			$tmp['ProductCategory']['name'] = $v['name'];
			$this->ProductCategory->save($tmp);
			$this->ProductCategory->id = false;
		}
	}
}

4 Comments to “Lưu nhiều record với CakePHP”

  • Lê Trung 02/12/2010 at 4:08 pm

    Mình muốn save 1 lúc 2 table thì làm sau bạn? Ví dụ: mình muốn save 5 products và cùng lúc đó save vào table ProductCategory 5 product đó (lấy 5 id của table products save vào table product_categories).

  • admin 03/12/2010 at 11:48 pm

    Không thể save cùng 1 lúc 2 table! Vẫn phải có cái save trước, cái save sau!

    ProductCategory là cha của Product? Nếu vậy, tại sao bạn lại save id của Product vào ProductCategory? Mình không hiểu bạn thiết kế db chỗ này ra sao!

    Có thể bạn muốn hỏi trường hợp này chăng:

    - Làm cái form thêm ProductCategory, trên form đó đồng thời cho thêm nhiều Product, lưu cùng lúc ProductCategory và Product?

    Nếu vậy, cách làm sẽ như sau:

    - Save ProductCategory trước. Sau đó code:

    $category_id = $this->ProductCategory->getLastInsertId()

    để lấy ra id của ProductCategory mới thêm vào

    - Cuối cùng là save Product với:

    $this->Product->category_id = $category_id

    Cách save nhiều Product cùng lúc thì bạn xem bài trên. Nhớ đặt cái code lấy $category_id ra ngoài hàm for nhé!

  • Lê Trung 06/12/2010 at 9:10 am

    Ý của mình là 1 product có thể nằm ở nhiều product_category. Mình làm dc rùi. Thanks.
    Đây là code của mình:

     
    if (!empty($_POST['total_link']))
    		{
    			//$data['Product']['name'] = $nameFile;
    			//$data['Product']['size'] =  $_FILES['Filedata']['size']/1024;
    			//$data['Product']['type'] =  $_FILES['Filedata']['type'];//$file['type'];//
     
    			$d=explode("\n",$_POST['total_link']);
    			$d=str_replace("\r","",$d);
    			for ($i=0; $iSession-&gt;read('FrontEndUser.id');
    					$item['Product']['is_url'] = 1;
    					$this-&gt;Product-&gt;id = null;
    				if($this-&gt;Product-&gt;save($item)){
    						$data_cat['ProductCategory']['category_id'] = 1;
    						$data_cat['ProductCategory']['user_id'] = $this-&gt;Session-&gt;read('FrontEndUser.id');
    						$data_cat['ProductCategory']['product_id'] = $this-&gt;Product-&gt;getLastInsertID();
    						$this-&gt;ProductCategory-&gt;id = null;
    						$this-&gt;ProductCategory-&gt;save($data_cat); 
    					}
    				}
    			}	
    		}
  • Đoàn Anh 06/08/2011 at 11:00 pm

    Anh Tuyền ơi, em hỏi với thế mình edit nhiều record thì làm thế nào ạ. cái khó nhất là cái đoạn hiển thị dữ liệu để edit anh có thể làm 1 tut về edit đc ko nhỉ?

Post comment

Follow us on Twitter! Follow us on Twitter!
Diễn đàn CakePHP cho người Việt Nam

Bài viết mới

Thảo luận mới

TAG

Calendar

June 2010
M T W T F S S
    Jul »
 123456
78910111213
14151617181920
21222324252627
282930  

Lưu trữ

Blogroll

Thống kê

6 khách