Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony] Dynamiczne tworzenie tabel/kolumn w bazie danych
Forum PHP.pl > Forum > PHP > Frameworki
Diwi
Witam,

Czy w symfony można dynamicznie z poziomu kodu php (akcji w kontrolerze) dodawać nowe tabele/kolumny do tabel w bazie danych MySQL ?

Oczywiście zrobienie zwykłego zapytania SQL nie jest problemem, jednakże po zmodyfikowaniu pliku schema.yml i wywołaniu

Kod
php symfony doctrine:build --all


"Dynamicznie" stworzone tabele są usuwane.

Potrzebne jest mi to do dosyć dynamicznego systemu obsługi danych pochodzących z konfigurowalnych formularzy. Można w nim tworzyć nowe formularze, dodawać do nich elementy (inputy,textarea, pole z datą itp. itd.) a następnie dane przesłane z formularza trafiają do bazy danych do dynamicznie tworzonych tabel (każdy formularz ma swoją osobną tabelę do przechowywania danych). Gdybym mógł to zastosowałbym rozwiązanie z tabelą o kolumnach key i value, niestety muszę mieć możliwość łatwego sortowania i wyszukiwania po paru kryteriach jednocześnie co uniemożliwia zastosowanie takiego rozwiązania (no chyba ze pobierałbym wszystkie rekordy, mapował na tablicę i wyszukiwał/sortował w czystym php, ale to samo w sobie jest bez sensu)
toffiak
Zamiast
  1. php symfony doctrine:build --all


użyj
  1. php symfony doctrine:build --all-classes


To uaktualni model, formularze i filtry nie usuwając bazy.
Crozin
Mógłbyś nieco dokładniej opisać to co robisz? Tworzenie osobnej tabeli dla każdego formularza to naprawdę głupi pomysł - a z obecnego opisu ciężko wywnioskować czy rzeczywiście konieczny.
Diwi
Pomysł jak pomysł, może nie idealny, ale jedyny, który pasuje do potrzeb:

System polega na tworzeniu formularzy zgłoszeniowych na różnego rodzaju wydarzenia i zbieranie danych o uczestnikach. Każdy formularz może być dosłownie "zbudowany" w panelu administracyjnym poprzez dodawanie elementów.

No i teraz potrzebuję mieć możliwość później w panelu administracyjnym wyświetlić w tabeli wszystkie dane, łatwo je posortować i wyszukiwać według konkretnych kryteriów (wielu naraz). Dlatego właśnie zdecydowałem się na tworzenie nowych tabel i kolumn pod każdy element formularza, bo to daje mi możliwość w łatwy sposób wykonywać w/w operacje, i własnie w tym miejscu odpadła opcja wykorzystania tabeli key => value.

Jeśli ktoś ma pomysł jak to za pomocą MySQL'a zrealizować inaczej, łatwiej, tak żeby nie modyfikować bazy danych dynamicznie, to stawiam duże duże piwo biggrin.gif bo będzie mi to też potrzebne w innym projekcie (w którym nie będą dodawane dynamicznie tabele, lecz kolumny)
Crozin
O ile dobrze rozumiem:

Pierwsza tabela na pola formularza: id, id formularza, nazwa pola, typ pola (enum: text, textarea, select itp.)
Druga tabela na predefiniowane wartości dla pól typu select, radio czy checkbox: id, id pola, wartość (..value="..."), słowna etykietka
Trzecia tabela to formularz - do niego podłączone są pola z pierwszej tabeli

Sam robiłem coś takiego i w mniej-więcej takiej formie spisało się.
Diwi
I coś takiego mam zaimplementowane, ale to jest dopiero I częśc czyli budowanie formularzy. Z tym pod względem bazy danych nie mam żadnego problemu.

Problematyczne jest zbieranie danych z tych formularzy w taki sposób aby później wyświetlić je w panelu administracyjnym w gridzie, wyszukiwać i sortować. Gdyby nie potrzeba wyszukiwania i sortowania to w ogóle nie byłoby problemu bo rozwiązanie na zasadzie tabeli key value byłoby wystarczające.
Crozin
Odpowiedzi mógłbyś wrzucać do kolejnej tabeli - pozostaje problem z zapisem odpowiedzi do list wielokrotnego wyboru.

Mam wrażenie, że tutaj lepiej byłoby skorzystać z nierelacyjnej bazy danych.
Diwi
To też nie jest problem, robię implode(',', $odpowiedzi) i jest ok.

A co do kolejnej tabeli, no to właśnie po to tworzę sobie dynamicznie tabele w systemie smile.gif i stąd moje pytanie na początku topicu.

A co do nierelacyjnej bazy, eh, gdybym mógł to bym w ogóle nie poruszał tematu smile.gif
Crozin
Cytat
To też nie jest problem, robię implode(',', $odpowiedzi) i jest ok.
Albo mi się wydaje, albo wcześniej wspomniałeś o jakimś sortowaniu - takie coś nie jest zbyt pomocne w takim razie. winksmiley.jpg
Cytat
A co do kolejnej tabeli, no to właśnie po to tworzę sobie dynamicznie tabele w systemie i stąd moje pytanie na początku topicu.
Tak, tylko Ty chciałeś robić osobną tabelę dla każdego formularza (nie wiem szczerze powiedziawszy jakby to miało pomóc) - a ja napisałem "kolejną" w sensie poza tymi trzema, czwarta na odpowiedzi - dla wszystkich formularzy wspólna.
Cytat
A co do nierelacyjnej bazy, eh, gdybym mógł to bym w ogóle nie poruszał tematu
Od biedy możesz i na XMLu czy zwykłych zserializowanych tablicach skończyć - w zależności od potrzeb czy raczej wymagań względem wydajności.
Diwi
Cytat
Tak, tylko Ty chciałeś robić osobną tabelę dla każdego formularza (nie wiem szczerze powiedziawszy jakby to miało pomóc) - a ja napisałem "kolejną" w sensie poza tymi trzema, czwarta na odpowiedzi - dla wszystkich formularzy wspólna.


No ok, ale to i tak wymagałoby tworzenia nowych kolumn dynamicznie, bo inaczej nie wyobrażam sobie takiej tabeli. No chyba że miałbyś jakiś pomysł smile.gif ?
Crozin
Cytat
ale to i tak wymagałoby tworzenia nowych kolumn dynamicznie, bo inaczej nie wyobrażam sobie takiej tabeli.
A nie wystarczy Ci ID pola plus wartość podana przez użytkownika?

Kod
+-----------------------------+
|        Formularze           |
+----+------------------------+
| id | nazwa                  |
+----+------------------------+
|  1 | Mój pierwszy formularz |
+----+------------------------+

+---------------------------------------+
|           Pola formularzy             |
+----+---------------+----------+-------+
| id | id formularza | typ      | nazwa |
+----+---------------+----------+-------+
|  1 |             1 | text     | Imię  |
|  2 |             1 | textarea | Adres |
|  4 |             1 | radio    | Płeć  |
+----+---------------+----------+-------+

+---------------------------------+
| Predefiniowane wartości dla pól |
+----+---------+------------------+
| id | id pola | wartość          |
+----+---------+------------------+
|  1 |       4 | Kobieta          |
|  2 |       4 | Mężczyzna        |
+----+---------+------------------+

+---------------------------------+
|          Odpowiedzi             |
+----+---------+------------------+
| id | id pola | wartość          |
+----+---------+------------------+
|  1 |       1 | Krzysiek         |
|  2 |       2 | Mój adres domowy |
|  3 |       4 | Mężczyzna        |
+----+---------+------------------+
Ostatnia tabela zawiera dane podane przez użytoniwka.
Diwi
To jest właśnie tabela key value, tak więc małe zadanko żebyś zobaczył że nie wystarczy smile.gif

Spróbuj wyszukać po dwóch różnych parametrach (np. wszystkich mężczyzn których imie zaczyna się na K) a potem posortuj według imion alfabetycznie smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.