2013-02-14 12 views
23

Làm cách nào để cập nhật nhiều trường trong mô hình Eloquent? Hãy nói rằng tôi đã nhận nó như thế này:Laravel 4: cách cập nhật nhiều trường trong mô hình Eloquent?

$user = User::where("username", "=", "rok"); 

Và sau đó tôi có tất cả các thông số mô hình:

$new_user_data = array("email" => "[email protected]", "is_superuser" => 1, ...); 

tôi không thể chỉ làm:

$user->update($new_user_data); 

cách thích hợp là gì? Tôi hy vọng không phải là foreach.

Tuy nhiên, các thao tác sau không hoạt động. Đây có phải là con đường để đi?

User::where("id", "=", $user->id)->update($new_user_data); 

Vấn đề với người cuối cùng (bên cạnh nó là clunky) là khi sử dụng nó từ một bối cảnh đối tượng, lĩnh vực được cập nhật không nhìn thấy được trong biến $this.

+0

Vâng, tôi nghĩ rằng khi cập nhật nhiều cột, lệnh 'cập nhật()' chức năng chỉ hoạt động khi cập nhật Mô hình trực tiếp. Nếu không, bạn phải sử dụng 'fill()' và 'save()'. – Pathros

Trả lời

55

Phương pháp bạn đang muốn tìm fill():

$user = User::where ("username","rok"); // note that this shortcut is available if the comparison is = 
$new_user_data = array(...); 
$user->fill($new_user_data); 
$user->save(); 

Trên thực tế, bạn có thể làm $user->fill($new_user_data)->save(); nhưng tôi tìm thấy những điều khoản riêng biệt một chút dễ dàng hơn để đọc và sửa lỗi.

+0

Đó là một sự xấu hổ mà họ không có cập nhật() hoặc lưu() với các dữ liệu mới ... nhưng điều này hoạt động. Ngoài ra hãy chắc chắn để xem xét các gói Ardent (nó làm cho mọi thứ đẹp hơn nhiều với xác nhận và cập nhật uniques). – Tom

+5

Có ai gặp lỗi này không: - Gọi đến phương thức chưa xác định Illuminate \ Database \ Query \ Builder :: fill() – Bik

+0

Hoạt động trên Laravel 5. Muchas gracias. – racl101

3

tôi nên đề nghị sử dụng mã ngắn hơn, chẳng hạn như

$new_user_data=array('a'=>'n','b'=>'m'); 
    $user=User::whereUsername('rok');//camelCase replaces "=" sign 
    $user->fill($new_user_data)->save(); 

Hoặc thậm chí ngắn hơn

$new_user_data=array('a'=>'n','b'=>'m'); 
    User::whereUsername('rok')->update($new_user_data);//camelCase replaces "=" sign 

Tôi tin rằng báo cáo kết quả cuối cùng là dễ dàng hơn để gỡ lỗi và trông đẹp hơn.
Cảnh báo: Nếu bảng của bạn chứa nhiều người dùng có tên 'rok', cả hai câu lệnh được đề cập sẽ cập nhật tất cả các thanh ghi đó cùng một lúc. Bạn nên luôn cập nhật sổ đăng ký với giá trị trường id.

9

Bạn đang tìm kiếm này:

$user = User::where("username","rok") 
       ->update( 
         array( 
          "email" => "[email protected]", 
          "is_superuser" => 1, 
          // .. 
          ) 
         ); 

Tham khảo: http://laravel.com/docs/4.2/eloquent#insert-update-delete

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi – abarisone

+0

@Kumar Ramalingam - Rất tốt, cảm ơn bạn :) – Sambhav

+0

@Sambhav - Chào mừng bạn –

0

Hãy thử điều này,

// took required data out of the request 
$postData = request(
    [ 
     'firstName', 
     'lastName', 
     'address1', 
     'address2', 
     'address3', 
     'postcode', 
     'phone', 
     'imageURL', 
    ] 
); 
// persisted it to the database 
DB::table('users') 
    ->where('id', auth()->user()->id) 
);