2016-04-03 19 views
6

Tôi có một mẫu Foo tương ứng với một bảng có các cột sau đây.Laravel Eloquent bỏ qua thuộc tính nếu không có trong bảng trong khi chèn

id
mô tả
user_id

Tôi đang thiết lập các thuộc tính của mô hình Foo cá nhân (không phân khối)

$foo = new Foo; 

$foo->id = 1; 
$foo->description = "hello kitty"; 
$foo->user_id = 55; 

//... 

$ foo được gửi đến một lớp học cho xử lý bổ sung, nhưng bởi vì lớp đó cần nhiều thông tin hơn, tôi chỉ muốn thêm nó vào mô hình $ foo.

//... 
$foo->bar = $additional_information; 

Event::fire(DoStuffWithFoo($foo)); 

$foo->save(); //error 

vấn đề là khi tôi $foo->save(), khiếu nại là bar không phải là một cột.

Tôi biết tôi có thể unset($foo->bar); trước khi lưu, nhưng ...

Có thể nói hùng hồn cho chỉ đơn giản là bỏ qua bất kỳ thuộc tính không phù hợp?

+0

Tôi nghĩ biến $ fillable của Eloquent có thể giúp bạn thích tại đây: http://stackoverflow.com/questions/20620364/can-eloquent-ignore-irrelevant-data-in-laravel-4 –

+0

Tôi thấy rằng, nhưng tôi nghĩ $ fillable chỉ dành cho nhiệm vụ đại chúng. Mà đoán tôi chỉ có thể tạo ra một mảng và vượt qua mà thay vì gán mỗi thuộc tính riêng ... '$ foo = new Foo ($ array);' – dangel

Trả lời

0

Thêm $ có thể điền và mô hình sẽ bỏ qua mọi thứ không có trong đó (thay vì đưa ra lỗi). Sử dụng hàm xây dựng để điền vào tất cả các cột là tùy chọn.

class Foo extends Model 
{ 
    protected $fillable = ['id', 'description', 'user_id']; 
} 

$f = new Foo(['id' => 1, 'description' => "hello monkey", 'user_id' => 55, 'bar' => 'wow']); // should work w/o error, but it ignores the 'bar'. 
+3

Hình như sử dụng '$ fillable' không chỉ ngăn cản bất kỳ nỗ lực để lưu giá trị đó với DB, nhưng nó cũng giữ cho thuộc tính không được đặt ở vị trí đầu tiên. Vì vậy, nói cách khác nó sẽ không hoàn toàn làm việc vì tôi cần thuộc tính đó được chuyển đến một lớp khác, nhưng không được lưu lại. – dangel

1

Tôi biết điều đó là quá muộn, nhưng bạn có thể đăng ký hoạt động saving bởi ghi đè các boot chức năng trong mô hình của bạn:

protected static function boot() { 
    parent::boot(); 

    static::saving(function($model) { 
     $savable = [...]; 
     if (count($savable) > 0) { 
      $model->attributes = array_intersect_key($model->attributes, array_flip($savable)); 
     } 
    }); 
} 

Đây là mã chưa được kiểm tra, nhưng ý tưởng là để loại bỏ các thuộc tính chưa giao cắt với biến số savable trước khi lưu mô hình. Biến số savable là một mảng các thuộc tính có thể cứu được. Ví dụ: $savable = ['foo', 'bar'] sẽ chỉ lưu các thuộc tính foobar.

Ưu điểm: Bạn có thể gán khối lượng bất kỳ thuộc tính nào bạn muốn mà không gây hại cho fillable hoặc guarded.

Nhược điểm: Các thuộc tính không được đánh dấu là savable, sẽ bị xóa khỏi mô hình sau khi lưu.

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