Không cho xóa các record đã được tham chiếu

cho mình hỏi, bình thường khi xây dựng database thì mình sẽ cài đặt các khóa chính, khóa ngoại, tham chiếu đến các bảng, rồi đẩy việc quản lý việc kiểm tra liên kết giữa các bảng để cho phép xóa hay ko cho hệ quản trị
vd: bảng Replies có quan hệ n-1 với bảng Topics, thì khi mình xóa 1 topic hệ quản trị sẽ kiểm tra xem có reply nào đang tham chiếu đến topic này không, nếu ko nó mới cho xóa
đây là chức năng của hệ quản trị mysql, khi mình cài đặt foreign key , referenced table , với các options như restrict,casade …

$table->foreign('topic_id')
      ->references('id')->on('topics')
      ->onDelete('cascade');

vấn đề ở đây mình muốn hỏi là mình không cài đặt cái đó thì có kĩ thuật nào giúp mình đạt được mục đích đó ko nhỉ, tức là mình tự kiểm tra được xem cái record mình muốn xóa có đang đc tham chiểu bởi bất cứ record nào ở các table khác không, hiện mình chỉ nghĩ ra 1 cách rất chuối đó là mỗi lần muốn xóa record nào, là phải select đến các bảng có tham chiếu đến nó xem có tồn tại id của record muốn xóa không

  1. Nếu bạn muốn vậy thì sao không dùng khóa ngọai và tham chiếu của database
  1. Rule kiểm tra như nào thì bạn tự define và viết hàm kiểm tra, chứ làm gì có cái nào build sẵn mà đúng ý bạn được
3 Likes
  1. vì 1 số yêu cầu
  2. thì như mình nói, hiện tại mình chỉ nghĩ đc 1 cách là phải select đến từng bảng, mình thấy cách này ko được tốt nên muốn hỏi xem có pro nào có cách nào hay hơn không

Bạn có thể chia sẻ cụ thể hơn về yêu cầu không
Giả sử như có gì đó đúng với cái bạn tìm, thì cơ chế của nó cũng y như bạn đang làm, hay thậm chí bản thân db nó cũng làm tương tự, vậy thì sao bạn không tự làm cái gì đó cho riêng mình

5 Likes

Thực ra, cách select tới từng bảng để kiểm tra ràng buộc logic là cách duy nhất để cậu đạt được mục đích, nếu cậu không dùng khóa ngoại.
Cậu cần cân nhắc sử dụng cả transaction. Trong transaction, cậu có thể select tới từng bảng, kiểm tra ràng buộc, xóa các dữ liệu liên quan và commit. Nếu cậu thất bại ở thao tác nào, cậu chỉ cần rollback transaction đó thôi.

Hope it helps!

3 Likes

cảm ơn bạn, mình cũng chỉ nghĩ ra đc cách đó, mình lên mạng tìm source code của softdelete đọc thấy nó cũng làm vậy để cập nhật hoặc xóa mềm trên table mà ko cần phải thêm ràng buộc trực tiếp trên hệ quản trị

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?