Yêu cầu thg 1 29, 2021 7:30 SA 174 0 3
  • 174 0 3
0

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

Chia sẻ
  • 174 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 CÂU TRẢ LỜI


Đã trả lời thg 1 29, 2021 7:43 SA
Đã được chấp nhận
+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

Chia sẻ
Avatar newbie @NanaCongchua
thg 1 29, 2021 8:02 SA

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

Avatar newbie @NanaCongchua
thg 1 29, 2021 8:31 SA

cảm ơn anh nhiều ạ 😄

Avatar Tran Duc Thang @thangtd90
thg 1 29, 2021 9:03 SA

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

Avatar newbie @NanaCongchua
thg 1 30, 2021 1:41 SA

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

Đã trả lời thg 1 29, 2021 7:32 SA
+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ì

Chia sẻ
Avatar newbie @NanaCongchua
thg 1 29, 2021 7:41 SA

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 😄

Avatar Hoàng Văn Tú @hoangvantundvnnew
thg 1 29, 2021 1:08 CH

cacaccaca

Đã trả lời thg 1 29, 2021 1:08 CH
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ỉ?

Chia sẻ
thg 3 4, 2021 2:24 SA

Quá kỳ diệu

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí