MySQL ile ağacından kayıt seçme

0 Cevap php

Note: Tüm bu ilave şeyler okumadan önce asıl soruyu okumak için aşağıya atlamak isteyebilirsiniz.

CakePHP için bir ACL uygulama üzerinde çalışıyorum. Ben AuthComponeny onu ayrılabilmesi için çalışıyorum Temelde çünkü böylece benim projeleri için Authsome kullanabilirsiniz. Ben aşağı uygulama teorisi var ama ben biraz engel isabet ettik.

Açıkçası ben en az aşağı veritabanı sorgu sayısını tutmak istiyorum. Yani (Ben ciddiye şüpheliyim.) Bu mümkün olduğunu kapalı şans burada soruyorum

Böyle bir tablo yapısı varsayarsak:

id - int(10), auto_increment, primary_key, not null
parent_id - int(10), null
model - varchar(255), utf8_bin, null
foreign_key - int(10), null
alias - varchar(255), utf8_bin, null,
lft - int(10), null
rght - int(10), null

Ve test etmek için bir kaç kayıtları (kontrolörler kök düğüm ve ben yanlış lft ve rght değerlerini alabilirsiniz):

1, null, null, null, controllers,          1,  14
2, 1,    null, null, one_test_controllers, 2,  7
3, 2,    null, null, one_action,           3,  4
4, 2,    null, null, two_action,           5,  6
5, 1,    null, null, two_test_controllers, 8,  13
6, 5,    null, null, one_action,           9,  10
7, 5,    null, null  two_action,           11, 12

Ve iki test yolları:

$test1 = '/controllers/one_test_controller/two_action';
$test2 = '/controllers/two_test_controller/two_action';

En alakalı en uygun gelen kimlikleri bir dizi dönen, bu sonuçlar veriyor:

// Result 1
array(
    0 => 4,
    1 => 2,
    2 => 1
)

// Result 2
array(
    0 => 7,
    1 => 5,
    2 => 1
)

Ne şu anda yapıyorum () ve array, ilk ad "two_action" uyan tüm kayıtları bulmak (bu örneğin $ test1 kullanarak) içine yolunu ing patlayabilir olduğunu; sonra sonuçları döngü ve son sonucun üst kimliği eşleşecek ve "one_test_controller" bir takma tüm kayıtları bulma. Sonra parent_id = 0 kadar tekrarlayın.

Çalışır ama açıkçası birden fazla yinelenen SQL sorguları ideal değildir, bu konuda bana yardımcı olabilecek bir sihirli SQL sorgusu var? Yoksa bu da alabilirim iyi olduğunu varsayarak sağ mıyım?

0 Cevap