Asked Jul 21st, 4:03 PM 136 0 3
  • 136 0 3
0

cho mình hỏi cơ chế insert trong laravel

Share
  • 136 0 3

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 ANSWERS


Answered Jul 22nd, 12:23 AM
Accepted
+3
  • 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.
Share
Answered Jul 21st, 4:17 PM
+1
Share
Yoshin @nhoxhocju
Jul 21st, 4:23 PM

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

0
| Reply
Share
Yoshin @nhoxhocju
Jul 21st, 6:36 PM

@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

0
| Reply
Share
Le Van Giang @le.van.giang
Jul 22nd, 12:59 AM

@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é
+1
| Reply
Share
Answered Jul 22nd, 12:24 AM
+1

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)

Share