@ Josh Leitzel
Bu düşünce çok kısıtlayıcı olduğunu (ve bence sağlam bir çözüm uygulamak için çok tembel olduğu için sadece bir bahane olduğunu) özellikle bir veritabanında ifade dinamik ağaç yapılar için,.
Aşağıdaki örneği inceleyin:
Benim proje mantıksal bir yapıya sahiptir:
Bir şirket hiyerarşi kişilerin cinsinden ifade edilir. Her varlık bir hiyerarşi üyesi veya hiyerarşi belirli bir düzeyde bir üyesi olarak olmanın genel durumda tedavi edebilirsiniz. Aşağıdaki gibi hiyerarşi kendisi, tek bir ağaç dalı gibi bir tablo tanımlanmıştır:
entity_structure (
id
name
parent_entity_structure_id
);
ve kişiler kendilerini ifade edilmektedir:
entities (
id
name
entity_structure_id
parent_id
);
Kullanım kolaylığı için ağaç düz bir görünüm oluşturur bir algoritma inşa ettik. Aşağıdaki somut örneği ne demek göstermektedir:
SELECT * FROM entity_structure;
id | name | entity_structure_parent_id
-----------------------------------------------------------
1 | Company | null (special one that always exists)
2 | Division | 1
3 | Area | 2
4 | Store | 3
Bu üretilen aşağıdaki düz temsili neden olur:
entity_tree (
entity_id
division_id
area_id
store_id
)
Bölünme düzeyde kişiler, division_id var area_id ve NULL, bir alan area_id olarak store_id vb NULL gibi store_id olur
Bu konuda güzel bir şey bunu takip benzer bir ifade kullanarak bir bölünme tüm çocukları sorgulamak sağlar olduğunu:
SELECT * FROM entity_tree WHERE division_id = :division_id;
Ancak bu ben sorgulama ediyorum işletmenin yapı düzeyini bildiğiniz varsayılmaktadır. Bunu yapmak güzel olurdu:
SELECT * FROM entity_tree WHERE :structure = :entity_id;
Ben tek bir varlığın yapı düzeyini anlamaya zor değil biliyorum, ama hepsi aynı düzeyde olmayabilir varlıkların bir koleksiyon döngü ediyorum varsayalım. Şimdi olduğu gibi hiyerarşinin her seviyesi için ayrı bir sorgu oluşturmak zorunda, ama ben alanları parametreleyebilir eğer ben aşağıdakileri yapabilirsiniz:
$children = array();
$stmt = $pdo->prepare('SELECT entity_id FROM entity_tree WHERE :structure = :entityId');
foreach ($entities AS $entity) {
$stmt->execute(array(
':structure' = $entity->getEntityStructureId(),
':entityId' = $entity->getId()
));
$children[$entity->getId()] = $stmt->fetchAll(PDO::FETCH_COLUMN);
}
temiz kod ve sadece bir hazır açıklamada sonuçlanır.
Tüm örnek hiçbir kullanıcı girişi kullanır.
Sadece bir şey düşünün.