@ Josh Leitzel
To myślenie jest bardzo restrykcyjne (i jest moim zdaniem tylko wymówka dla bycia zbyt leniwy, aby wdrożyć solidne rozwiązanie), zwłaszcza dynamiczne struktury drzewa wyrażona w bazie danych.
Rozważmy następujący przykład:
Mój projekt ma logiczną strukturę:
Hierarchia firma wyrażonego w jednostkach. Każda jednostka może być traktowana w ogólnym przypadku bycia członkiem hierarchii lub członkiem określonego poziomu hierarchii. Sama hierarchia jest zdefiniowane w tabeli jako pojedynczej gałęzi drzewa w następujący sposób:
entity_structure (
id
name
parent_entity_structure_id
);
a same jednostki są wyrażone jako:
entities (
id
name
entity_structure_id
parent_id
);
Dla ułatwienia mam wbudowany algorytm, który tworzy płaski widok drzewa. Poniższy konkretny przykład przedstawia to, co oznacza:
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
Spowodowałoby następujące płaskie przedstawienie produkowane:
entity_tree (
entity_id
division_id
area_id
store_id
)
jednostek, które znajdują się na poziomie podziału musiałby division_id, area_id i store_id NULL , Obszar area_id i store_id jako NULL, itp.
To miło, że pozwala na zapytanie wszystkich dzieci w dziale za pomocą instrukcji podobnej do poniższej:
SELECT * FROM entity_tree WHERE division_id = :division_id;
Jednak to zakłada, że znam poziom struktury podmiotu, którego szukam.Byłoby miło zrobić:
SELECT * FROM entity_tree WHERE :structure = :entity_id;
wiem, że to nie jest trudne, aby dowiedzieć się poziom struktura pojedynczego podmiotu, ale zakładamy, mam zapętlenie poprzez zbiór jednostek, które nie wszyscy mogą być na tym samym poziomie . Jak to jest teraz muszę budować oddzielne kwerendy dla każdego poziomu hierarchii, ale czy mogę parametryzacji pól mogłem wykonać następujące czynności:
$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);
}
powodując czystszego kodu i tylko jeden przygotowane oświadczenie.
Cały przykład nie wykorzystuje danych wprowadzonych przez użytkownika.
Po prostu coś do rozważenia.
Dzięki za odpowiedź. Okazuje się, że pierwsze wysłane przeze mnie zapytanie nie działa - jeśli powiążesz, powiedz "tytuł" do ": pole", to po prostu wybierze ciąg "tytuł", a nie wartość pola. Dziwne, że nie ma metody wiązania kolumn/tabel, ponieważ teraz muszę dodać dodatkowe zabezpieczenie, które powinno obsługiwać PDO:/ – DisgruntledGoat
Myślenie kryjące się za tym prawdopodobnie polega na tym, że naprawdę nie powinno się pozwolić użytkownicy bezpośrednio wybierają pola/tabele, które wywołuje zapytanie. Ale zgadzam się, że dodaje trochę dodatkowej pracy do końca. –
Widzę twój punkt widzenia. Używam go jednak w sytuacji, w której tylko ja określam tabele, ale w sposób abstrakcyjny, np. 'displayTable ('epizod')'. Chyba nie muszę się martwić o parametry/bezpieczeństwo w tym przypadku. – DisgruntledGoat