logo
Published on

Tiết kiệm thời gian khi thêm/sửa model với Mass Assignment

Mục lục

Sử dụng Mass Assignment để thêm/sửa

Thông thường, khi tạo một model mới các bạn thường sẽ set từng thuộc tính của model, sau đó sử dụng phương thức save() để lưu model đó lại trên CSDL:

Ví dụ ta có model Post như sau:

public function store(Request $request)
{
		$data = $request->validate(...);

		$post = new Post();
		$post->title = $data['title'];
		$post->content = $data['content'];
		$post->author_id = $data['author_id'];
		$post->save();;

		return $post;
}

Tạo một model với Mass assignment

Để sử dụng Mass assignment đầu tiên bạn cần khai báo những thuộc tính nào được phép cập nhật bên trong model Post. Biến $fillable chính là những thuộc tính nào mà các bạn muốn Laravel cho phép cập nhật thông qua Mass assignment:

class Post extends Model
{
		protected $fillable = [
        'title',
        'content',
        'author_id',
    ];
}

Bây giờ trong controller bạn chỉ cần khai báo những trường dữ liệu nào được phép gán và sử dụng lệnh tạo giống như thế này:

public function store(Request $request)
{
		$data = $request->validate(...);

		$post = Post::create($data);

		return $post;
}

Sửa một model với Mass assignment

Tương tự khi sửa, bạn chỉ cần gọi phương thức update() và truyền một mảng dữ liệu vào:

public function update(Request $request, $post_id)
{
		$data = $request->validate(...);
		$post = Post::findOrFail($post_id);

		$post->update($data);

		return $post;
}

Tạo model thông qua một Relationship

Đôi khi bạn sẽ cần tạo ra một bài viết cho một User chẳng hạn, thì bạn chỉ cần trỏ tới relationship của nó rồi sau đó gọi hàm create()

public function store(Request $request, $user_id)
{
		$data = $request->validate(...);
		$user = User::findOrFail($user_id);

		$post = $user->posts()->create($data);

		return $post;
}

Những vấn đề cần lưu ý khi sử dụng Mass Assignment

Không validate dữ liệu nhập vào:

Ở ví dụ ở trên, phương thức $request->all() sẽ cho phép người dùng cập nhật tất cả những trường mà người dùng nhập vào, trong nhiều trường hợp, người dùng sẽ cập nhật luôn cả những thuộc tính không cho phép cập nhật qua form (ví dụ email) vì vậy bạn cần validate dữ liệu trước khi sử dụng Mass assignment nhé:

public function store(Request $request)
{
		$data = $request->validate([
				'title' => 'required|string',
				'content' => 'required|string',
				'author_id' => 'required',
		]);

		$post = Post::create($data);

		return $post;
}

Nếu bạn thích những bài viết như thế này, hãy đăng ký nhận email hàng tuần, mình sẽ tổng hợp các bài viết hay trong tuần và gửi email thông báo đến các bạn:

Đăng ký nhận thông báo