Asked Jan 29th, 7:30 AM 117 0 3
  • 117 0 3
0

Hỏi về hàm create của laravel

Share
  • 117 0 3

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 ANSWERS


Answered Jan 29th, 7:43 AM
Accepted
+4

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ường id, created_at, updated_at ... tuy nhiên dù có truyền những thông tin đó vào hàm create() 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

Share
tung pham son @NanaCongchua
Jan 29th, 8:02 AM

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 ạ?

0
| Reply
Share
tung pham son @NanaCongchua
Jan 29th, 8:31 AM

cảm ơn anh nhiều ạ 😄

0
| Reply
Share
Tran Duc Thang @thangtd90
Jan 29th, 9:03 AM

@NanaCongchua

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 ạ 😄

+1
| Reply
Share
tung pham son @NanaCongchua
Jan 30th, 1:41 AM

@thangtd90 em cảm ơn anh nhiều ạ. Đúng là hiểu sâu lúc nào cũng tốt hơn ạ 😄

0
| Reply
Share
Answered Jan 29th, 7:32 AM
+2

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ì

Share
tung pham son @NanaCongchua
Jan 29th, 7:41 AM

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 Screenshot_1.png thật kì diệu 😄

0
| Reply
Share
Hoàng Văn Tú @hoangvantundvnnew
Jan 29th, 1:08 PM

cacaccaca

0
| Reply
Share
Answered Jan 29th, 1:08 PM
0

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ỉ?

Share