--=REKLAMA=--

Dostęp do bazy z wykorzystaniem JDatabase

Z Joomla!WikiPL

Wersja Zwiastun (dyskusja | edycje) z dnia 20:52, 7 gru 2013

(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Poradnik to połączenie dwóch niezależnych części:

  • Wstawianie, zmienianie i usuwanie danych z bazy danych.
  • Wyszukiwanie danych z jednej lub wielu tabel oraz przedstawianie ich w wielu formach

Ta sekcja dokumentu przedstawia wstawianie, zmienianie i usuwanie danych z bazy danych. Żeby zobaczyć inną część kliknij tutaj

Wprowadzenie

Joomla wprowadza wyszukaną abstrakcyjną warstwę bazy danych, aby uprościć jej użycie. Nowe wersje Joomla Platform API wprowadza dodatkowe funkcje, które dodatkowo rozszerzają możliwości warstwy baz danych oraz wprowadzają funkcje takie jak połączenia (aby zwiększyć gamę serwerów baz danych oraz umożliwić tworzenie łańcuchów zapytań, aby zwiększyć czytelność kodu czy uprościć zapytania SQL).

Joomla może używać wielu rodzajów baz danych SQL oraz wprowadza różnorodność środowisk o różnych przedrostkach tabel. Dodatkiem jest to, że klasy automatycznie nawiązują połączenie z bazą danych. Oprócz obiektu potrzebujesz tylko dwóch linijek kodu aby otrzymać wynik z bazy danych w wielu formatach. Używając abstrakcyjnej warstwy baz danych zapewniamy maksymalną kompatybilność i elastyczność rozszerzenia.

Zapytania

Zapytania do baz danych zostały zmienione wraz z nową strukturą Joomla nazwaną "zapytania łańcuchowe". Jest to rekomenowany sposób tworzenia zapytań do bazy danych (chociaż "zapytania strunowwe" dalej są obłusgiwane).

Zapytania łańcuchowe zakładają połączenie wielu metod, tak aby jedna wywoływana po drugiej powracała do obiektu, który może obsłużyć kolejną metodę, co zwiększa czytelność kodu.

Aby uzyskać nową instancję klasy JDatabaseQuery możemy użyć metody getQuery klasy JDatabaseDriver:

$db = JFactory::getDbo();
 
$query = $db->getQuery(true);

JDatabaseDriver::getQuery przyjmuje jeden opcjonalny parametr ($new), który może przyjąć wartość prawda lub fałsz (domyślnie jest to fałsz).

Aby wykonać zapytanie możemy posłużyć się metodami zawartymi w JDatabaseQuery (najczęściej) przy użyciu języka SQL, ukrywając tym samym składnię kwerendy uzależnioną w głównej mierze od programisty oraz zwiększając przenośność kodu źródłowego.

Niektóre z częściej używanych, dołączonych metod to: SELECT, FROM, JOIN, WHERE, ORDER. Są też metody takie jak INSERT, UPDATE, DELETE, które służą do modyfikacji rekordów w bazie danych. Dzięki nim i zapytaniom łańcuchowym metod, można stworzyć niemal każde zapytanie bez utraty przenośności kodu.

Wstawianie rekordu

Użycie SQL

Klasa JDatabaseQuery wprowadza metody przeznaczone do tworzenia nowych rekordów. Do najczęściej używanych należą: insert, columns i values.

// tworzenie połączenia z bazą danych
$db = JFactory::getDbo();
 
// tworzenie obiektu odpowiedzialnego za zapytania
$query = $db->getQuery(true);
 
// tworzenie tablicy przechowującej nazwy kolumn
$columns = array('user_id', 'profile_key', 'profile_value', 'ordering');
 
// wstawianie wartości
$values = array(1001, $db->quote('custom.message'), $db->quote('Inserting a record using insert()'), 1);
 
// przygotowanie do zapytania odpowiedzialnego za nowy rekord
$query
    ->insert($db->quoteName('#__user_profiles'))
    ->columns($db->quoteName($columns))
    ->values(implode(',', $values));
 
// ustawienie wartości zapytania używając nowo wypełnionego obiektu i wykonanie go
$db->setQuery($query);
$db->query();

Używając obiektu

Klasa JDatabaseDriver umożliwia nam także dużo wygodniejszy sposób, a mianowicie przez zapisanie obiektu bezpośrednio w bazie danych bez napisania ani jednej linijki SQL.

// tworzenie i wypełnianie obiektu
$profile = new stdClass();
$profile->user_id = 1001;
$profile->profile_key='custom.message';
$profile->profile_value='Wstawianie rekordu przy użyciu insertObject()';
$profile->ordering=1;
 
// Wstawiaie obiektu do odpowiedniej tabeli
$result = JFactory::getDbo()->insertObject('#__user_profiles', $profile);

Warto zauważyć, że nie musimy odnieść się do nazwy tabeli, metdoa insertObject zrobi to za nas.

Metoda insertObject będzie generować wyjątek, jeśli napotka na błąd poczas wstawiania rekordu.

Należy upewnić cię, że rekord, który chcemy wstawić, nie istnieje już w bazie danych. Warto upewnić się o potencjalnych problemach, tudzież powieleniu rekordu, przed wstawieniem danych do bazy.

Aktualizowanie rekordu

Używając SQL

Klasa JDatabaseQuery wprowadza także metody służące do zmieniania (aktualizowania) rekordów, a zwłaszcza update i set. We also reuse another method which we used when creating select statements, the where method.

$db = JFactory::getDbo();
 
$query = $db->getQuery(true);
 
// pola do zmiany
$fields = array(
    $db->quoteName('profile_value') . '=\'Updating custom message for user 1001.\'',
    $db->quoteName('ordering') . '=2'
);
 
// warunki, które określają, które rekordy zostaną zaktualizowane
$conditions = array(
    $db->quoteName('user_id') . '=42', 
    $db->quoteName('profile_key') . '=\'custom.message\''
);
 
$query->update($db->quoteName('#__user_profiles'))->set($fields)->where($conditions);
 
$db->setQuery($query);
 
$result = $db->query();

Używając obiektów

Podobnie jak insertObject, klasa JDatabaseDriver umożliwia na zmienienie danych zawatych w rekodach poprzez obiekt.

Poniżej przykład, w którym aktualizujemy wybraną tabelę nowymi wartościami używając klucza głównego

// tworzymy nowy obiekt reprezuntujący rekord po zmianach
$object = new stdClass();
 
// wartość klucza głównego musi być prawidłowa
$object->id = 1;
$object->title = 'My Custom Record';
$object->description = 'A custom record being updated in the database.';
 
// Zmieniamy dane w tabeli użytkowników używając w tym celu klucza głównego
$result = JFactory::getDbo()->updateObject('#__custom_table', $object, 'id');

Podobnie do insertObject, updateObject pozwala nam na niepodawanie nazwy tabeli oraz generuje wyjątek podczas błędu.

Przed zmianami danych w rekordach powinniśmy upewnić się, że dany rekord istnieje.

Usuwanie rekordu

Istnieje także metoda odpowiedzialna za usuwanie rekordów z bazy danych.

$db = JFactory::getDbo();
 
$query = $db->getQuery(true);
 
// usunięcie wszystkich klucze dla użytkownika 1001.
$conditions = array(
    $db->quoteName('user_id') . '=1001', 
    $db->quoteName('profile_key') . '=\'custom.%\''
);
 
$query->delete($db->quoteName('#__user_profiles'));
$query->where($conditions);
 
$db->setQuery($query);
 
 
$result = $db->query();


© Ten materiał jest dokładnym albo swobodnym tłumaczeniem artykułu http://docs.joomla.org/Selecting_data_using_JDatabase udostępnionego na licencji JEDL na witrynie: Oficjalnej dokumentacji Joomla!.Pierwszy autor oryginału: Wilsonge.
© Tłumaczenie: Procek. Tłumaczenie wykonano na warunkach licencji JEDL.

Dziękujemy za wkład

» Stefan Wajda [zwiastun],