Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Qt] QTableView - relacyjny widok z bazy danych
winuser
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 22.10.2010

Ostrzeżenie: (0%)
-----


Witajcie

Aktualnie piszę aplikację bazodanową co prawda nie w PHP, a w C++ z użyciem bibliotek Qt, baza danych to MySQL więc chyba dział dobry. I mam pewien problem nad którym się głowię. Mianowicie posiadam 2 tabele, jedna w której przechowywane są osoby w formie (dajmy na to lista klientów) :

  1. int user_id
  2. VARCHAR(40) name


natomiast druga tabela (dajmy na to do przechowywania listy zakupów):

  1. int user_id
  2. int product_id


Tabele z listą zakupów wyświetlam w widżecie QTableView, po wcześniejszym powiązaniu jej z QSqlTableModel. Chciałbym aby zamiast liczb w tabeli z listą zakupów (pole user_id) było wyświetlane automatycznie pole "name" z tabeli klientów. Niestety typy pól są inne (int vs varchar) i nie mam pomysłu jak coś takiego zrobić. Pomożecie ? smile.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
YaQzi
post
Post #2





Grupa: Zarejestrowani
Postów: 94
Pomógł: 31
Dołączył: 12.10.2008
Skąd: WAT

Ostrzeżenie: (0%)
-----


Nie rozumiem trochę...

"Chciałbym aby zamiast liczb w tabeli z listą zakupów (pole user_id) było wyświetlane automatycznie pole "name" z tabeli klientów."
Przebuduj sobie strukturę tabeli i inserty do niej. :x

Chyba, że chodzi Ci o zapytanie do bazy, które połączy te dwie tabele i da listę product_id | name to:
  1. SELECT L.product_id,
  2. (
  3. SELECT name
  4. FROM osoba
  5. WHERE user_id = L.user_id
  6. )
  7. FROM lista L


albo za pomocą JOIN takie coś.


--------------------
 Wszystkie wielkości świata nie są tyle warte, co dobra przyjaźń...
Go to the top of the page
+Quote Post
Rid
post
Post #3





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

Ostrzeżenie: (0%)
-----


Cytat
Nie rozumiem trochę...

Prawdę mówiąc, ja też nie.

Zawsze można konwertować string na int przed zapisem do bazy,tylko po co questionmark.gif
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A ja bym Ci się radził zastanowić czy MySQL to tutaj dobry wybór... Aplikacja będzie bowiem wymagać do działania postawionego serwera, co niekoniecznie będzie możliwe jeśli ma ona być przenośna. Zabierzesz soft na pendrive i u kogoś nie uruchomisz już bo on nie będzie umiał dostać się do bazy. W takich wypadkach lepiej zdać się na wspieraną także w Qt inną bazę... SQlite.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
winuser
post
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 22.10.2010

Ostrzeżenie: (0%)
-----


@up nie rozumiem co twoja wypowiedź ma do rzeczy ? Ja nie zadałem pytania typu "jaką bazę wybrać aby nie wymagała serwera SQL". BA, nawet nigdzie nie napisałem, że ma ona być przenośna. Wybacz, ale drażnią mnie ludzie którzy wszędzie wszystkim chcą wciskać swoje mądrości.

Niestety nikt z was mnie nie zrozumiał tongue.gif Być może dlatego że ja piszę projekt w C++ a wy używacie PHP. Jak już wspomniałem używam bibliotek Qt do zrealizowania tego projektu, że używam klasy QTableView z wywołaniem setModel(QSqlTableModel) która to klasa ostatnia odwala za mnie wszystkie zapytania i automatycznie wyświetla je w tabelce.

Najbliżej odpowiedzi poprawnej był YaQzi, za co dostaje punkt.

Skorzystam z klasy QSqlRelationalTableModel.

Ten post edytował winuser 20.07.2011, 00:34:52
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To co napisałem w sprawie bazy to była tylko sugestia. Niestety, ale obecność bibliotek Qt do obsługi różnych baz w przypadku braku postawionego na kompie serwera tejże bazki jest tak samo sensowna jak próba gaszenia pożaru bez posiadania czegokolwiek do tego celu wink.gif Ma ona sens tylko w wypadku gdy faktycznie całość będzie nieprzenośna. IMHO uważam, że takie podejście to bardzo poważne ograniczenie.
Co do samego tematu...
  1. SELECT l.*, u.name FROM lista AS l LEFT JOIN users AS u ON l.user_id = u.user_id
YaQuzi dał wynik, ale jego wydajność jest delikatnie mówiąc nieco dyskusyjna. Dobrze chociaż, że zauważył, iż JOIN można użyć.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
YaQzi
post
Post #7





Grupa: Zarejestrowani
Postów: 94
Pomógł: 31
Dołączył: 12.10.2008
Skąd: WAT

Ostrzeżenie: (0%)
-----


Join też tego magicznie nie skleja tylko musi podobnie do podselecta wyszukać co połączyć. wink.gif Na moje oko to user_id w drugiej tabeli jest co najmniej uniq więc nie ma powtarzalnych podselectów po tym samym. Krócej w kodzie nie zawsze znaczy wydajniej ale dobra, w sumie nie o wydajności temat. tongue.gif

@winuser
Jeśli QSqlTableModel daje Ci model jednej z tabel bazy danych to spróbuj sobie z zapytania zrobić widok i do niego dostać się przez QSqlTableModel.


--------------------
 Wszystkie wielkości świata nie są tyle warte, co dobra przyjaźń...
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Owszem, ale podzapytania zazwyczaj (wiadomo... zależy od sytuacji) są mniej wydajne niż złączenia. Poza kartezjańskim, które najczęsciej jest efektem kompletnego braku wiedzy o złączeniach w bazie u piszącego.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
tiraeth
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Kolego winuser, drażnią mnie osoby, które nawet nie sięgają do oficjalnej dokumentacji Nokii nt. chociażby QSqlRelationalTableModel. Zanim następnym razem zadasz pytanie, przeglądnij dokumentację biblioteki, której używasz.

Zakładając, że masz:
users: user_id, name
user_products: user_id, product_id

I chcesz wyświetlić wszystkie rekordy z user_products, automatycznie dołączając zawartość tabeli users i ukrywając pole user_id, powinieneś zrobić coś takiego:

  1. QSqlRelationalTableModel *model = new QSqlRelationalTableModel;
  2. model->setTable("user_products");
  3. model->setRelation(1, QSqlRelation("users", "user_id", "name"));


Co oznacza: kolumna "1" w tabeli user_products jest kluczem obcym do tabeli users (gdzie kluczem głównym jest user_id) i jej zawartość ma zostać zastąpiona zawartością kolumny name z tabeli users.

Ponieważ temat nie ma nic wspólnego z MySQL, przenoszę do go Komputery i oprogramowanie.
Powód edycji: [tiraeth]: Autor sobie sam odpowiedział i raczył nawet zedytować swój post, więc zamknę temat.
Go to the top of the page
+Quote Post

Closed TopicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 14:59