2016-04-27 31 views
7

Sự khác biệt giữa phương thức save()cập nhật() trong Laravel là gì.Lưu vs cập nhật trong laravel

Tôi đã sử dụng phương thức save() trong trường hợp truy vấn cập nhật nhưng trong vài trường hợp, nó hoạt động như bản cập nhật và trong vài trường hợp, nó hoạt động như hàm truy vấn chèn. Xin vui lòng cho tôi biết chính xác sự khác biệt giữa chúng.

Trả lời

17

Cả hai phương pháp này đều cho phép bạn lưu dữ liệu vào cơ sở dữ liệu.

Các save() phương pháp perfroms như INSERT khi bạn tạo ra một mô hình mới được hiện đang không được trình bày trong bảng cơ sở dữ liệu của bạn:

$flight = new Flight; 

$flight->name = $request->name; 

$flight->save(); // it will INSERT a new record 

Ngoài ra nó có thể hoạt động như một UPDATE, khi mô hình của bạn đã tồn tại trong cơ sở dữ liệu . Vì vậy, bạn có thể nhận được các mô hình, sửa đổi một số thuộc tính và sau đó save() nó, thực sự thực hiện db của UDPATE:

$flight = App\Flight::find(1); 

$flight->name = 'New Flight Name'; 

$flight->save(); //this will UPDATE the record with id=1 

Một phương pháp update() cho phép bạn cập nhật mô hình của bạn theo cách thuận tiện hơn:

App\Flight::where('active', 1) 
      ->where('destination', 'San Diego') 
      ->update(['delayed' => 1]); // this will also update the record 

Vì vậy, bạn thậm chí không nên chỉ định mô hình đã truy xuất cho bất kỳ biến nào. Các thuộc tính được cập nhật được chuyển thành các đối số.

Ví dụ và thông tin thêm trong số Laravel's docs.

4

Chỉ còn một điều chưa được trả lời trong phần @ginopane nói về sự khác biệt và đó là nếu bạn sử dụng phương thức cập nhật trên query builder result thì Laravel sẽ bỏ qua $fillable hoặc $guard mảng của mô hình của bạn. Điều này đặc biệt quan trọng nếu bạn muốn sử dụng Input::all() như một cuộc tranh cãi để cập nhật:

Post::where('id', $id)->update(Input::all()); 

Vì vậy, trong trường hợp này nếu bạn sử dụng App\Flight::where('active', 1)->update(Input::all()); mọi thứ trong cơ sở dữ liệu của bạn sẽ được cập nhật ngay cả khi bạn đặt nó trong $fillable. Vì vậy, hãy đảm bảo sử dụng các phương pháp saveupdate trên Eloquent instance và không sử dụng phương thức trình xây dựng truy vấn. Các mã sau đây sẽ ổn ngay cả khi người sử dụng gửi các lĩnh vực mà bạn không muốn để chèn hoặc cập nhật trong bảng databse của bạn:

// User model 
protected $fillable = ['email', 'name']; 


// controller 
public function update($id) 
{ 
    $user = User::findOrFail($id); 

    // validate the input here, use Request to do the job or whatever you like 

    $user->update(Input::all()); 

    return view('some_view')->with('notice', 'user updated'); 
} 

Bây giờ, không có vấn đề gì với MẪU được thông qua ở đây, chỉ nameemail sẽ tiếp tục cập nhật.

Hy vọng câu trả lời đầy đủ @ginopane này

Các vấn đề liên quan