cho mình hỏi cơ chế insert trong laravel
Chào mọi người ạ. Mình hiện đang tìm hiểu cơ chế insert bảng chính và bản phụ trong laravel. Mình đang thắc mắc ví dụ khi thao tác insert, update hoặc delete bảng chính và bảng phụ. Ví dụ trường hợp insert bảng chính là bảng quyền. và bảng chi tiết là bảng quyen_ungdung. Khi insert bảng chính xong thì ta lấy ra id vừa insert bảng chính thành công ra insert vào bảng phụ. Ví dụ nếu trong quá trình insert bảng phụ sai thì nó sẽ báo lỗi và cho mình hỏi nó có rollback lại ko ạ? Bảng chính vừa insert thành công có được rollback lại ko ạ?
- Và mọi người cho hỏi trường hợp insert 1 bảng chính và nhiều bảng phụ thì mọi người dùng cách gì insert để code trông tốt hơn? xử lý request như thế nào cho hợp lý? và check lỗi như thế nào để nó ko bị lộ code khi lỗi ???? Mong mọi người giải đáp
3 CÂU TRẢ LỜI
- Nếu quá trình insert mà gặp lỗi thì nó không rollback nhé. Để rollback được bạn phải dùng transaction. Và bạn hãy đưa tất cả nhưng query insert, update vào trong transaction, tới lúc đó thì chỉ cần 1 action của bạn bị lỗi thì sẽ rollback lại tất cả
- Bạn có thể dùng attach, sync để insert, update (với quan hệ n-n), còn nếu là 1-n thì bạn cần truy vẫn tới quan hệ được thiết lập trong model. VD: user có nhiều role.
$user->roles()->create([]);
hoặc tạo nhiều
$user->roles()->createMany([]);
- Và nếu muốn không hiển thị laravel errors screen thì bạn để debug là false.
- để có thể rollback lại dữ liệu thì bạn có thể tìm hiểu Transaction chi tiết bạn có thể tham khảo tại đây https://laravel.com/docs/7.x/database#database-transactions
- nếu là quan hệ 1 - n thì khi bạn lưu dữ liệu bảng chính xong bạn có thể dùng createMany() để tạo dữ liệu nhiều của bảng phụ chi tiết bạn tham khảo https://laravel.com/docs/7.x/eloquent-relationships#the-create-method
- còn nếu là quan hệ n - n thì bạn có thể dùng attach https://laravel.com/docs/7.x/eloquent-relationships#updating-many-to-many-relationships
@le.van.giang mình biết là có transaction, nhưng ý là mình hỏi mặc định khi tạo bảng phụ sai thì bảng chính có rollback ko á???? hay là sai báo lỗi nhưng nếu bảng chính đã insert thành công thì nó sẽ vẫn còn????
@le.van.giang mà bạn cho mình hỏi trường hợp dùng attach thì kiểu trả về của attach sẽ là null, nếu muốn kiểm tra kiểu trả về của attach thì chỉ có thể dựa vào exception. Mà khi lỗi exception sẽ show lỗi cho người dùng xem. Nếu muốn tắt lỗi thì chỉnh lại chế độ debug hả bạn? Bạn đã bao giờ gặp trường hợp này chưa? và cho mình xin cách xử lý với
@nhoxhocju nếu bạn dùng Transaction và đặt nó ở đầu tiên thì khi bạn thêm bảng phụ bị lỗi thì dữ liệu ở bảng chính sẽ bị rollback nhé
try {
DB::beginTransaction();
// code xử lý
// nếu bạn muốn check lỗi attach thì sẽ dùng
if (attach === null) {
throw new Exception('lỗi cần thông báo');
}
DB::commit(); // nếu code xử lý thành công thì mới commit dữ liệu
return;
} catch (Exception $e) {
DB::rollBack(); // nếu code phía trên xẩy ra lỗi thì sẽ được rollback
return;
}
- bạn thử dùng như trên xem sao
- khi bạn code ở môi trường local thì nên bật debug để check còn khi được deploy lên serve thì nên tắt debug đi nhé
- để có thể rollback lại dữ liệu thì bạn có thể tìm hiểu Transaction chi tiết bạn có thể tham khảo tại đây https://stackoverflow.com/questions/22906844/laravel-using-try-catch-with-dbtransaction
Dúng transaction sẽ phụ thuộc vào chỗ nào bắt đầu đánh chỉ mục index để sau nếu có lỗi thì rollback về vị trí đấy. nên nếu ở bảng chính trước khi insert bạn đánh 1 chỉ mục rồi sau đó thực hiện như bình thường insert vào 2 bảng kia nếu có lỗi thì nó sẽ rollback về vị trí trước bảng chính. Còn báo lỗi thì nó vẫn báo lỗi như bình thường nơi sảy ra lỗi
-
insert 1 bảng chính và nhiều bảng phụ thì mọi người dùng cách gì insert để code trông tốt hơn có thể dùng attach
-
tạo nhiều thì dùng: createMany
-
check lỗi như thế nào để nó ko bị lộ code khi lỗi: trên production trong file .env bạn để
debug: false
APP_ENV=production
tắt debug bar (không báo lỗi chi tiết tránh lộ lỗi cho attack)