Saya memiliki tabel berikut:

directories
    id
    parent_directory_id

users
    id

user_directory_access
    directory_id
    user_id

Contoh:

Saya perlu menemukan directories dengan id dari 45 yang memiliki parent_directory_id rekursif yang ada di tabel user_directory_access yang memiliki user_id 3

Saya idealnya ingin pengguna untuk secara otomatis mewarisi akses ke direktori jika mereka memiliki akses ke salah satu direktori induk (rekursif di seluruh hierarki) jadi misalnya jika saya memiliki akses ke direktori root, saya harus diizinkan mengakses semua anak melalui 1 record disimpan dalam tabel user_directory_access.

Apa yang akan menjadi solusi yang layak? Saya terbuka untuk restrukturisasi jika diperlukan.

0
Ricky Barnett 20 Maret 2019, 20:44

1 menjawab

Jawaban Terbaik

Anda dapat memiliki peta (cache dalam memcache atau file atau tabel lain) dari directory_id dan daftar parent_directory_id dari induknya, jadi untuk struktur ini:

1
┣━━━2
┃   ┗━━━4
┃       ┗━━━5
┗━━━3

Peta Anda akan terlihat seperti ini:

$parents_map = [
    1 => [],
    2 => [1],
    3 => [1],
    4 => [2, 1],
    5 => [4, 2, 1],
];

Setiap kali Anda menambahkan direktori anak baru, cari parent_map dari induknya sendiri dan tambahkan ke peta:

// new directory 6 whose parent is 3:
$new_id = 6;
$parent_id = 3;
$parents_map[$new_id] = array_merge([$parent_id], $parents_map[$parent_id]);

Kemudian ketika Anda perlu memeriksa izin untuk sebuah direktori, cari di peta dan lihat apakah ada induknya yang memiliki izin.

$directory_id = 6;
foreach($parents_map[$directory_id] as $parent_id) {
    check_permissions($user_id, $parent_id);
}
2
solarc 20 Maret 2019, 18:06