Hỏi về hàm create của laravel
Chào ACE, hôm này mình có tìm hiểu về hàm create của laravel và test thử. Ví dụ table users của mình có trường name, address nhưng khi tạo form mình có thử tạo thêm vào input là phone_number, job... để thử xem có bị lỗi không? Thật kì diệu là code vẫn chạy ngon lành. Mình có thử dump vào câu query thì nó chỉ insert những trường có trong bảng users mà thôi. Cho mình hỏi có phải hàm create nó đã lọc sẵn ra những trường được phép insert vào bảng users có phải không nhỉ?
3 CÂU TRẢ LỜI
Laravel Model có một chức năng gọi là Mass Assignment
, hiểu đơn giản là chỉ những property nào được khai báo trong biến $fillable
trong Model, thì mới có thể được lưu vào trong Database thông qua hàm create()
.
Như model User
mặc định của Laravel thì biến $fillable
được khai báo tại đây https://github.com/laravel/laravel/blob/8.x/app/Models/User.php#L19
protected $fillable = [
'name',
'email',
'password',
];
Tức chỉ có các trường name
, email
, password
là có thể được lưu lại khi sử dụng hàm create
của model.
Điều đó đồng nghĩa với việc:
- Trong bảng
users
có các trườngid
,created_at
,updated_at
... tuy nhiên dù có truyền những thông tin đó vào hàmcreate()
thì chúng cũng sẽ bị bỏ qua - Bạn có truyền các thông tin khác, vốn là các cột không tồn tại trong bảng
users
, thì tất nhiên, chúng cũng sẽ bị bỏ qua.
Bạn có thể đọc thêm về chức năng Mass Assignment này trên document của Laravel tại đây
Em đang hiểu các hàm update, updateOrCreate... đều tương tự anh nhỉ. Nếu em khai báo trong biến
protected $guarded = [
'id'
];
thì cũng tương tự với $fillable
đúng không ạ?
cảm ơn anh nhiều ạ
Em đang hiểu các hàm update, updateOrCreate... đều tương tự anh nhỉ
Uhm, đúng rồi, theo anh nhớ là như vậy. Mấy hàm mà truyền một mảng vào, rồi kỳ vọng sẽ tạo mới, hay update các thông số trong mảng, thì đều gọi là mass assignment.
Còn $guarded
thì em hiểu đơn giản nó hơi ngược với $fillable
, một cái là bảo vệ danh sách các trường có thể mass assign được bằng cách whitelist ($fillable
), còn một cái là bảo vệ danh sách các trường có thể mass assign được bằng cách blacklist ($guarded
).
whitelist mặc dù có thể vất vả hơn (mỗi khi em thêm một cột vào, mà cần mass assign thì sẽ phải sửa biến $fillable
), tuy nhiên sẽ an toàn hơn. Mình vẫn nên dùng $fillable
hơn em ạ
@thangtd90 em cảm ơn anh nhiều ạ. Đúng là hiểu sâu lúc nào cũng tốt hơn ạ
nếu dùng create thì nó sẽ xem nhưng trường nào có trong $fillable thì nó lưu thôi b, cái nào không có thì nó bỏ qua, nên là đưa dữ liệu thừa cũng k ảnh hưởng gì
Mình có dump vào câu query thì thấy trước khi chạy câu query insert có dòng này thật kì diệu
cacaccaca
Chào ACE, hôm này mình có tìm hiểu về hàm create của laravel và test thử. Ví dụ table users của mình có trường name, address nhưng khi tạo form mình có thử tạo thêm vào input là phone_number, job... để thử xem có bị lỗi không? Thật kì diệu là code vẫn chạy ngon lành. Mình có thử dump vào câu query thì nó chỉ insert những trường có trong bảng users mà thôi. Cho mình hỏi có phải hàm create nó đã lọc sẵn ra những trường được phép insert vào bảng users có phải không nhỉ?
Quá kỳ diệu