Formularz i operacje na bazie danych
Zanim zaczniesz
Przed kontynuowaniem upewnij się, że znasz podstawy SQL oraz relacji między tabelami, takich jak „jeden do wielu” i „wielu do jednego”.
Ponadto potrzebna jest wcześniejsza znajomość Forms Netuno i sposobu ich organizacji, aby w pełni wykorzystać DB Form.
Wprowadzenie
W tworzeniu oprogramowania często musimy pobierać informacje z bazy danych, a używanie do tego czystego SQL sprawia, że staje się to masowe i stresujące. DB Form zamienia konstruowanie zapytań SQL w intuicyjne i pozbawione stresu doświadczenie. Dzięki niemu możesz tworzyć zaawansowane zapytania za pomocą przyjaznych metod, które abstrahują złożoność surowego SQL, zapewniając podejście do tworzenia zapytań zgodne z Twoim sposobem myślenia.
Jak to działa
W sercu DB Form znajduje się możliwość strukturyzowania poleceń SQL za pomocą obiektów i metod. Zamiast pisać polecenia SQL bezpośrednio, DB Form pozwala używać mechanizmu obiektowego do programowego definiowania zapytań i operacji.
Każde zapytanie lub operacja na bazie danych jest reprezentowana jako obiekt.
Tworzysz instancje klas zapytań, które enkapsulują różne części SQL, takie jak selekcja, filtrowanie, grupowanie itp. Wykonujesz także operacje usuwania, wstawiania i aktualizowania rekordów.
Inicjalizacja
Wszystko zaczyna się od inicjalizacji DB Form, który musi wiedzieć, jaka będzie nazwa formularza bazowego lub głównego, który zostanie użyty, czyli formularze w Netuno zawsze reprezentują tabele w bazie danych, więc jest to równoznaczne ze wskazaniem tabeli bazowej lub tabeli głównej.
W tym przykładzie inicjujemy DB Form na podstawie formularza/tabeli osoby:
const dbFormularzOsoby = _db.form("osoby")
Po zainicjowaniu DB Form możemy wykonywać zapytania lub operacje.
Proste zapytanie
DB Form udostępnia dwie bardzo常见 metody pozyskiwania danych, poza paginacją i wynikami distinct, są to:
all— Wszystkie rekordy jako lista.first— Pobiera tylko pierwszy rekord.
Zobacz poniższe przykłady.
Aby pobrać wszystkie osoby:
const dbOsoby = _db.form("osoby")
.all()
Aby pobrać tylko jedną osobę:
const dbOsoba = _db.form("osoby")
.first()
Filtry i warunki
Za pomocą where możemy filtrować dane spełniające określone warunki.
Zobacz kilka przykładów:
const dbOsoba = _db.form("osoby")
.where(_db.where("osoby_id_uzytkownika").equals(_user.id))
.first()
const dbOsoby = _db.form("osoby")
.where(
_db.where("typ").in(_val.list().add("klient").add("administrator"))
.and("email").notEqual(null)
).all()
Porównania Where
_db.where udostępnia obiekt Where, który obsługuje następujące operacje porównania:
Porównania z operatorami numerycznymi i tekstowymi:
equal(...)lubequals(...)— Sprawdza równość, to jest=.notEqual(...)lubnotEquals(...)— Czy jest różne od przekazanej wartości, to jest<>.greaterThan(...)— Czy jest większe od przekazanej wartości, to jest>.lessThan(...)— Czy jest mniejsze od przekazanej wartości, to jest<.greaterOrEqualsThan(...)— Czy jest większe lub równe przekazanej wartości, to jest>=.lessOrEqualsThan(...)— Czy jest mniejsze lub równe przekazanej wartości, to jest<=.
Warunki tekstowe z operatorem LIKE:
startsWith('text')— Czy zaczyna się od określonego prefiksu, to jestLIKE '...%'.endsWith('text')— Czy kończy się określonym sufiksem, to jestLIKE '%...'.contains('text')— Czy zawiera dany termin, to jestLIKE '%...%'..
Warunki z listami z operatorem IN:
in(_val.list()...)— Czy jest równe którejś wartości z listy, to jest warunekIN (...).notIn(_val.list()...)— Czy nie jest równe żadnej wartości z listy, to jest warunekNOT IN (...).
Praktyczne przykłady zapytań
DB Form jest dostępny z poziomu zasobu _db.form('form'); po wywołaniu masz w rękach zapytanie bazowe, które można skonfigurować za pomocą dostępnych w nim metod i obiektów.
Wiele do jednego i wyniki distinct
const zapytanie = _db.form('osoby')
.where(
_db.where('imie').startsWith('jan')
.and(
_db.where('email').contains('jan')
.or('email').endsWith('com')
)
)
.link('praca', _db.where('kod').equal('kierownik'))
.join(
_db.manyToOne(
'netuno_user',
'osoby_id_uzytkownika',
_db.where('mail').startsWith('jan')
).join(
_db.manyToOne(
'netuno_group',
'id_grupy',
_db.where('kod').equal('osoby')
)
)
)
.get("osoby.imie", "osoby_imie")
.get("osoby.aktywny", "osoby_aktywny")
.get("osoby.uid", "osoby_uid")
.debug(true)
.distinct(true)
const wyniki = zapytanie.all();
W powyższym przykładzie wykonujemy zapytanie do tabeli osoby, łącząc ją z dwiema innymi tabelami, praca i netuno_user, gdzie praca jest powiązana przez metodę link, a netuno_user przez join. Można zauważyć, że link jest znacznie prostszy niż join, ponieważ link wykorzystuje relację z Form Netuno do mapowania związku, podczas gdy join używa wyłącznie informacji przekazanych w metodzie. Można także zauważyć pozostałe użyte metody i obiekty, takie jak:
where: Obiekt udostępniany do budowania warunków dla tabeli.link: Metoda, która wiąże tabelę główną z inną tabelą przy użyciu kryteriówFormNetuno.join: Metoda, która przyjmuje obiekt relacji między tabelami.get: Metoda, która określa, jakie pola zostaną zwrócone w zapytaniu.manyToOne: Obiekt określający typ relacji między tabelami, w tym przypadku relację typuMany To One.debug: Metoda określająca, czy zbudowane zapytanie zostanie wypisane w konsoli.distinct: Metoda określająca, czy polecenieDISTINCTzostanie zastosowane do zapytania.all: Metoda, która wykonuje zapytanie i zwraca wyniki w postaci listy.
Metoda
linkpowinna być używana tylko wtedy, gdy tabele są już powiązane przezFormNetuno.
Pierwszy rekord z relacją i sortowaniem
const zapytanie = _db.form('osoby')
.where(
_db.where('imie').startsWith('jan')
.and('email').in(
_val.list().add('pierwszy@mail.com').add('drugi@mail.com'))
)
.link('praca')
.get("osoby.imie", "osoby_imie")
.get("osoby.aktywny", "osoby_aktywny")
.get("praca.kod", "praca_kod")
.order('osoby.wiek', 'desc')
.debug(true)
const pierwszyWynik = zapytanie.first();
Na końcu powyższego przykładu wywołujemy metodę first(), która zwraca pierwsze wystąpienie znalezione podczas wykonywania zapytania; jeśli nie znajdzie żadnego, zwróci null.
Paginacja
const zapytanie = _db.form('osoby')
.link(
'praca',
_db.link('zadanie')
)
.get("osoby.imie", "osoby_imie")
.get("osoby.aktywny", "osoby_aktywny")
.get("praca.kod", "praca_kod")
.group("osoby.id")
.debug(true)
const strona = zapytanie.page(_db.pagination(1, 10));
Numer strony w obiekcie Pagination zaczyna się od 1, więc powyższy przykład jest równoważny:
offset = 0ilimit = 10.
Na końcu powyższego przykładu wywołujemy metodę page(), przekazując jako parametr obiekt pagination, który zawiera preferencje paginacji. Zwróci ona obiekt strony z równoważnymi atrybutami, na przykład:
{
"hasNext": false,
"hasPrevious": false,
"items": [
{
"praca_kod": "stazysta",
"osoby_aktywny": true,
"osoby_imie": "Jan Kowalski"
},
{
"praca_kod": "kierownik",
"osoby_aktywny": true,
"osoby_imie": "Anna Nowak"
}
],
"pageNumber": 1,
"pageSize": 10,
"totalElements": 2,
"totalPages": 1
}
Wstawianie rekordów
Aby wstawić dane do bazy danych, używamy metody insert, na przykład:
const dbWstawionaOsoba = _db.form("osoby")
.set("imie", "Jan Kowalski")
.set("email", "jan@mail.com")
.insert();
Na podstawie wyniku insert możemy uzyskać id rekordu, który został wstawiony do bazy danych.
Zatem w dbWstawionaOsoba uzyskujemy id wstawionego rekordu w następujący sposób:
_log.info("ID wstawionej osoby: "+ dbWstawionaOsoba.getInt('id'))
Edycja rekordów
Poprzez obiekt DB Form możesz aktualizować rekordy zapytania w łatwy i intuicyjny sposób.
_db.form('osoby')
.link(
'praca',
_db.where('kod').equal('stazysta')
)
.set("imie", "nowe imie")
.set("email", "mojnowyemail@mail.com")
.update();
Ważne. Metodaupdate()zaktualizuje wszystkie wystąpienia zapytania, więc zachowaj ostrożność podczas jej używania.
Ponadto możesz użyć innych metod w połączeniu, takich jak
order()ilimit(), aby ulepszyć zapytania.
Usuwanie rekordów
DB Form pozwala także w prosty sposób usuwać rekordy zwrócone w zapytaniu.
_db.form('osoby')
.link(
'praca',
_db.where('kod').equal('stazysta')
)
.delete();
Ważne. Metodadelete()usunie wszystkie wystąpienia zapytania, więc zachowaj ostrożność podczas jej używania.
Podobnie jak w pozostałych przypadkach, możesz połączyć inne metody, takie jak
order()ilimit(), aby ulepszyć wyniki.