Het selecteren van gegevens met behulp van JDatabase

From Joomla! Documentation

This page is a translated version of the page Selecting data using JDatabase and the translation is 96% complete.

Other languages:
English • ‎español • ‎français • ‎Nederlands • ‎русский • ‎中文(中国大陆)‎ • ‎中文(台灣)‎
Joomla! 
3.x
Joomla! 
2.5
Versie opmerking

Let op dat veel online voorbeelden $db->query() gebruiken in plaats van $db->execute(). Dit was de oude methode in Joomla 1.5 en 2.5 en zal deprecated (verouderd) berichten geven in Joomla 3.0+.

Deze handleiding is opgesplitst in twee aparte delen:

  • Invoegen, bijwerken en verwijderen van gegevens in de database.
  • Selecteren van gegevens uit één of meer tabellen en het ophalen op diverse verschillende formaten.

Dit gedeelte van de documentatie kijkt naar het selecteren van gegevens uit een database tabel en het ophalen in verschillende formaten. Klik hier voor om het andere deel te lezen.

Inleiding

Joomla biedt een geavanceerde database abstractie laag om het gebruik door externe ontwikkelaars te vereenvoudigen. Nieuwe versies van de Joomla Platform API bieden extra functionaliteit welke de database laag verder uitbreidt en bevat functies zoals koppelingen naar een groot aantal database servers en de query-koppeling om de leesbaarheid te vergroten van verbindingscode an het vereenvoudigen van het coderen van SQL.

Joomla kan verschillende soorten SQL database systemen gebruiken en draaien op diverse omgevingen met verschillende tabel-voorvoegsels. Naast deze functies maakt de class automatisch de database verbinding aan. Naast het instantiëren van het object heeft u slechts twee regels code nodig om het resultaat uit de database te krijgen in een verscheidenheid aan formaten. Het gebruik van de Joomla database laag garandeert een maximum aan compatibiliteit en flexibiliteit voor uw extensie.

De query

Joomla's database querying veranderd met de introductie van Joomla 1.6. De aanbevolen manier van het bouwen van database queries is met behulp van "query chaining" (hoewel string queries nog wel worden ondersteund).

Query chaining verwijst naar de methode van koppelen van een aantal methodes, de één na de ander waarbij ieder methode een object terug geeft die de volgende methode kan ondersteunen, waardoor de leesbaarheid verbeterd wordt en de code vereenvoudigd.

Om een nieuwe instantie van de JDatabaseQuery class te verkrijgen gebruiken we de JDatabaseDriver getQuery methode:

$db = JFactory::getDbo();

$query = $db->getQuery(true);

De JDatabaseDriver::getQuery neemt een optioneel argument, $new, welke 'waar' of 'niet waar' kunnen zijn (de standaard is 'niet waar').

Om onze data source te bevragen kunnen we een aantal JDatabaseQuery methodes aanroepen; deze methodes kapselen de gegevens source's query-taal (in de meeste gevallen SQL) in, verbergen query-specifieke syntaxis voor de ontwikkelaar en verhogen de overdraagbaarheid van de broncode van de ontwikkelaar.

Enkele van de meest gebruikte methodes omvatten; select, from, join, where en order. Er zijn ook methodes zoals insert, update en delete voor het wijzigen van de gegevensopslag. Door het koppelen van deze en andere methodes aanroepen, kunt u bijna iedere query maken ten opzichte van uw database zonder afbreuk te doen aan de overdraagbaarheid van uw code..

Selecteren van gegevens uit een enkele tabel

Hieronder staat een voorbeeld hoe je een database query aanmaakt met behulp van de JDatabaseQuery klasse. Met gebruik van de select, from, where en order methodes, kunnen we queries maken die flexibel, makkelijke leesbaar en draagbaar zijn.

// Get a db connection.
$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);

// Select all records from the user profile table where key begins with "custom.".
// Order it by the ordering field.
$query->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')));
$query->from($db->quoteName('#__user_profiles'));
$query->where($db->quoteName('profile_key') . ' LIKE '. $db->quote('\'custom.%\''));
$query->order('ordering ASC');

// Reset the query using our newly populated query object.
$db->setQuery($query);

// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();

De query kan ook geschakeld worden om het volgende te vereenvoudigen:

$query
    ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
    ->from($db->quoteName('#__user_profiles'))
    ->where($db->quoteName('profile_key') . ' LIKE '. $db->quote('\'custom.%\''))
    ->order('ordering ASC');

Chaining kan handig zijn wanneer queries langer en complex worden.

Groeperen werkt ook simpel. De volgende query telt het aantal artikelen in iedere categorie.

$query
    ->select( array('catid', 'COUNT(*)') )
    ->from($db->quoteName('#__content'))
    ->group($db->quoteName('catid'));

Een limiet kan worden ingesteld op een query met behulp van "setLimit". Bijvoorbeeld in de volgende query, die zou teruggebracht worden naar 10 records.

$query
    ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
    ->from($db->quoteName('#__user_profiles'))
    ->setLimit('10');

Selecteren van gegevens uit meerdere tabellen

Met behulp van de JDatabaseQuery's join methodes, kunnen we gegevens selecteren van meerdere gerelateerde tabellen. De algemene "join" methode heeft twee argumenten; het join "type" (binnen, buiten, links, rechts) en de join voorwaarden. In het volgende voorbeeld zul je merken dat we alle zoekwoorden kunnen gebruiken die we normaal gesproken gebruiken als we een SQL query zouden schrijven, inclusief het 'Als' zoekwoord voor alias tabellen en het 'Aan' zoekwoord om relaties tussen de tabellen te maken. Let op dat de tabel alias wordt gebruikt in alle methodes die verwijzen naar tabel kolommen (I.e. select, where, order).

// Get a db connection.
$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);

// Select all articles for users who have a username which starts with 'a'.
// Order it by the created date.
// Note by putting 'a' as a second parameter will generate `#__content` AS `a`
$query
    ->select(array('a.*', 'b.username', 'b.name'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');

// Reset the query using our newly populated query object.
$db->setQuery($query);

// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();

De join methode hierboven stelt ons in staat om zowel op inhoud als gebruikerstabellen te doorzoeken, artikelen ophalend met de autheur details. Er zijn ook gemakkelijke methodes voor joins:

We kunnen meerdere joins gebruiken voor een query van meer dan twee tabellen:

$query
    ->select(array('a.*', 'b.username', 'b.name', 'c.*', 'd.*'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->join('LEFT', $db->quoteName('#__user_profiles', 'c') . ' ON (' . $db->quoteName('b.id') . ' = ' . $db->quoteName('c.user_id') . ')')
    ->join('RIGHT', $db->quoteName('#__categories', 'd') . ' ON (' . $db->quoteName('a.catid') . ' = ' . $db->quoteName('d.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');

Let op hoe chaining de broncode veel leesbaarder maakt voor deze langere query's.

Soms, heb je ook de 'als' clausule nodig als je items selecteert om conflicten met kolomnamen te vermijden. In dit geval, kunnen meerdere select-punten worden ge-chained in combinatie met het gebruik van de tweede parameter van $db->quoteName.

$query
    ->select('a.*')
    ->select($db->quoteName('b.username', 'username'))
    ->select($db->quoteName('b.name', 'name'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');

Een tweede reeks kan ook gebruikt worden als de tweede parameter van de select punten om de waarden te vullen van de 'als' clausule. Vergeet niet om de nullen toe te voegen in de tweede reeks om te verwijzen naar kolommen in de eerste reeks waar je de 'als' clausule niet voor wilt gebruiken.

$query
    ->select(array('a.*'))
    ->select($db->quoteName(array('b.username', 'b.name'), array('username', 'name')))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');


De resultaten van de query

De database klasse bevat vele methodes voor het werken met een query resultaat.

Enkele waarde resultaat

loadResult ()

Gebruik loadResult() als je verwacht dat het resultaat een enkele waarde is vanuit de database query.

id naam email gebruikersnaam
1 John Smith johnsmith@domein.voorbeeld johnsmith
2 Magda Hellman magda_h@domein.voorbeeld magdah
3 Yvonne de Gaulle ydg@domein.voorbeeld ydegaulle

Dit is vaak het resultaat van een 'getelde' query om een aantal gegevens te krijgen:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('COUNT(*)');
$query->from($db->quoteName('#__my_table'));
$query->where($db->quoteName('name')." = ".$db->quote($value));

// Reset the query using our newly populated query object.
$db->setQuery($query);
$count = $db->loadResult();

of waar je gewoon een enkel veld zoekt van een rij in de tabel (of mogelijk een enkel veld van de eerste rij weergeven).

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('field_name');
$query->from($db->quoteName('#__my_table'));
$query->where($db->quoteName('some_name')." = ".$db->quote($some_value));

$db->setQuery($query);
$result = $db->loadResult();


Enkele rij resultaten

Elk van deze resultaten functies geven een enkel gegeven uit de database, ook al komen er meerdere overeen met de ingestelde criteria. Om meer gegevens te krijgen zul je de functie nog eens moeten gebruiken.

id naam email gebruikersnaam
1 John Smith johnsmith@domein.voorbeeld johnsmith
2 Magda Hellman magda_h@domein.voorbeeld magdah
3 Yvonne de Gaulle ydg@domein.voorbeeld ydegaulle

loadRow()

loadRow() geeft een geïndexeerde reeks van een enkel record in de tabel:

. . .
$db->setQuery($query);
$row = $db->loadRow();
print_r($row);

geeft:

Array ( [0] => 1, [1] => John Smith, [2] => johnsmith@domain.example, [3] => johnsmith ) 
Je kunt toegang krijgen tot de individuele waarden met behulp van:
$row['index'] // e.g. $row['2']

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.
  2. Terwijl je de oproep voor de volgende rijen kunt herhalen, is een van de functies die meerdere rijen weergeeft nuttiger.

loadAssoc()

loadAssoc() geeft een geïndexeerde reeks van een enkel record in de tabel:

. . .
$db->setQuery($query);
$row = $db->loadAssoc();
print_r($row);

geeft:

Array ( [id] => 1, [naam] => John Smith, [email] => johnsmith@domein.voorbeeld, [gebruikersnaam] => johnsmith )
Je kunt toegang krijgen tot de individuele waarden met behulp van:
$row['name'] // e.g. $row['email']

Opmerkingen:

  1. Terwijl je de oproep voor de volgende rijen kunt herhalen, is een van de functies die meerdere rijen weergeeft nuttiger.

loadObject()

loadObject herhaalt een PHP object van één record in de tabel:

. . .
$db->setQuery($query);
$result = $db->loadObject();
print_r($result);

geeft:

stdClass Object ( [id] => 1, [naam] => John Smith, [email] => johnsmith@domein.voorbeeld, [gebruikersnaam] => johnsmith )
Je kunt toegang krijgen tot de individuele waarden met behulp van:
$result->index // e.g. $result->email

Opmerkingen:

  1. Terwijl je de oproep voor de volgende rijen kunt herhalen, is een van de functies die meerdere rijen weergeeft nuttiger.

Enkele kolom resultaten

Elk van deze resultaten functies geeft een enkele kolom weer vanuit de database.

id naam email gebruikersnaam
1 John Smith johnsmith@domein.voorbeeld johnsmith
2 Magda Hellman magda_h@domein.voorbeeld magdah
3 Yvonne de Gaulle ydg@domein.voorbeeld ydegaulle

loadColumn()

loadColumn() geeft een geïndexeerde reeks van een enkele kolom in de tabel:

$query->select('name'));
      ->from . . .";
. . .
$db->setQuery($query);
$column= $db->loadColumn();
print_r($column);

geeft:

Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle )
Je kunt toegang krijgen tot de individuele waarden met behulp van:
$column['index'] // e.g. $column['2']

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.
  2. loadColumn() is gelijk aan loadColumn(0).

loadColumn($index)

loadColumn($index) geeft een geïndexeerde reeks vanuit een enkele kolom in de tabel:

$query->select(array('name', 'email', 'username'));
      ->from . . .";
. . .
$db->setQuery($query);
$column= $db->loadColumn(1);
print_r($column);

geeft:

Array ( [0] => johnsmith@domein.voorbeeld, [1] => magda_h@domein.voorbeeld, [2] => ydg@domein.voorbeeld )
Je kunt toegang krijgen tot de individuele waarden met behulp van:
$column['index'] // e.g. $column['2']

loadColumn($index) laat je door een serie van kolommen in de resultaten herhalen.

. . .
$db->setQuery($query);
for ( $i = 0; $i <= 2; $i++ ) {
  $column= $db->loadColumn($i);
  print_r($column);
}

geeft:

Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle ),
Array ( [0] => johnsmith@domain.example, [1] => magda_h@domain.example, [2] => ydg@domain.example ),
Array ( [0] => johnsmith, [1] => magdah, [2] => ydegaulle )

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.

Meerdere rijen resultaten

Elk van deze resultaten functies geeft een meerdere records weer vanuit de database.

id naam email gebruikersnaam
1 John Smith johnsmith@domain.example johnsmith
2 Magda Hellman magda_h@domain.example magdah
3 Yvonne de Gaulle ydg@domain.example ydegaulle

loadRowList()

loadRowList() geeft een geïndexeerde reeks van geïndexeerde reeksen uit de tabel records gegeven door de query:

. . .
$db->setQuery($query);
$row = $db->loadRowList();
print_r($row);

geeft (met regeleinden toegevoegd voor de duidelijkheid):

Array ( 
[0] => Array ( [0] => 1, [1] => John Smith, [2] => johnsmith@domain.example, [3] => johnsmith ), 
[1] => Array ( [0] => 2, [1] => Magda Hellman, [2] => magda_h@domain.example, [3] => magdah ), 
[2] => Array ( [0] => 3, [1] => Yvonne de Gaulle, [2] => ydg@domain.example, [3] => ydegaulle ) 
)
Je kunt toegang krijgen tot de individuele rijen met behulp van:
$row['index'] // e.g. $row['2']
en je kunt toegang krijgen tot de individuele waarden met behulp van:
$row['index']['index'] // e.g. $row['2']['3']

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.

loadAssocList()

loadAssocList() geeft een geïndexeerde reeks van verwante reeksen vanuit de records uit de tabel door de query:

. . .
$db->setQuery($query);
$row = $db->loadAssocList();
print_r($row);

geeft (met regeleinden toegevoegd voor de duidelijkheid):

Array ( 
[0] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith ), 
[1] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h@domain.example, [username] => magdah ), 
[2] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg@domain.example, [username] => ydegaulle ) 
) 
Je kunt toegang krijgen tot de individuele rijen met behulp van:
$row['index'] // e.g. $row['2']
en je kunt toegang krijgen tot de individuele waarden met behulp van:
$row['index']['column_name'] // e.g. $row['2']['email']

loadAssocList($key)

loadAssocList('key') geeft een bijbehorende reeks - geïndexeerd op 'key' - van de bijbehorende reeksen van de tabel gegevens door de query:

. . .
$db->setQuery($query);
$row = $db->loadAssocList('username');
print_r($row);

geeft (met regeleinden toegevoegd voor de duidelijkheid):

Array ( 
[johnsmith] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith ), 
[magdah] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h@domain.example, [username] => magdah ), 
[ydegaulle] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg@domain.example, [username] => ydegaulle ) 
)
Je kunt toegang krijgen tot de individuele rijen met behulp van:
$row['key_value'] // e.g. $row['johnsmith']
en je kunt toegang krijgen tot de individuele waarden met behulp van:
$row['key_value']['column_name'] // e.g. $row['johnsmith']['email']

Opmerking: Key moet een geldige kolomnaam uit de tabel zijn; dit hoeft geen index of primaire key te zijn. Maar als het geen unieke waarde heeft ben je niet in staat om de resultaten betrouwbaar op te halen.

loadAssocList($key, $column)

loadAssocList('key', 'column') geeft een associatieve reeks, geïndexeerd op 'key', van de waarden uit de kolomnaam 'kolom', gegeven door de query:

. . .
$db->setQuery($query);
$row = $db->loadAssocList('id', 'username');
print_r($row);

geeft (met regeleinden toegevoegd voor de duidelijkheid):

Array ( 
[1] => John Smith, 
[2] => Magda Hellman, 
[3] => Yvonne de Gaulle,
)

Opmerking: Key moet een geldige kolomnaam uit de tabel zijn; dit hoeft geen index of primaire key te zijn. Maar als het geen unieke waarde heeft ben je niet in staat om de resultaten betrouwbaar op te halen.

loadObjectList()

loadObjectList() geeft een geïndexeerde reeks van PHP objecten uit de tabel records gegeven door de query:

. . .
$db->setQuery($query);
$row = $db->loadObjectList();
print_r($row);

geeft (met regeleinden toegevoegd voor de duidelijkheid):

Array ( 
[0] => stdClass Object ( [id] => 1, [name] => John Smith, 
    [email] => johnsmith@domain.example, [username] => johnsmith ), 
[1] => stdClass Object ( [id] => 2, [name] => Magda Hellman, 
    [email] => magda_h@domain.example, [username] => magdah ), 
[2] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle, 
    [email] => ydg@domain.example, [username] => ydegaulle ) 
)
Je kunt toegang krijgen tot de individuele rijen met behulp van:
$row['index'] // e.g. $row['2']
en je kunt toegang krijgen tot de individuele waarden met behulp van:
$row['index']->name // e.g. $row['2']->email

loadObjectList($key)

loadObjectList('key') geeft een bijbehorende reeks - geïndexeerd op 'key' - van objecten uit de tabel gegeven door de query:

. . .
$db->setQuery($query);
$row = $db->loadObjectList('username');
print_r($row);

geeft (met regeleinden toegevoegd voor de duidelijkheid):

Array ( 
[johnsmith] => stdClass Object ( [id] => 1, [name] => John Smith, 
    [email] => johnsmith@domain.example, [username] => johnsmith ), 
[magdah] => stdClass Object ( [id] => 2, [name] => Magda Hellman, 
    [email] => magda_h@domain.example, [username] => magdah ), 
[ydegaulle] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle, 
    [email] => ydg@domain.example, [username] => ydegaulle ) 
)
Je kunt toegang krijgen tot de individuele rijen met behulp van:
$row['key_value'] // e.g. $row['johnsmith']
en je kunt toegang krijgen tot de individuele waarden met behulp van:
$row['key_value']->column_name // e.g. $row['johnsmith']->email

Opmerking: Key moet een geldige kolomnaam uit de tabel zijn; dit hoeft geen index of primaire key te zijn. Maar als het geen unieke waarde heeft ben je niet in staat om de resultaten betrouwbaar op te halen.

Diverse resultaten instel methoden

getNumRows()

getNumRows() geeft een aantal rijen als resultaat gevonden met SELECTEER of TOON query en wacht om gelezen te worden. Om een resultaat te krijgen vanuit getNumRows() moet je deze uitvoeren na de query en voor je de reultaten kunt ophalen. Bij het achterhalen van de rijen beïnvloed door een INSERT, UPDATE, REPLACE or DELETE query, gebruik dan getAffectedRows().

. . .
$db->setQuery($query);
$db->execute();
$num_rows = $db->getNumRows();
print_r($num_rows);
$result = $db->loadRowList();
geeft
3

Opmerking: getNumRows() is alleen geldig voor opgaven als SELECTEER of TOON die een werkelijk resultaat toont. Als je getNumRows() uitvoerd na loadRowList() - of een andere ophaalmethode - krijg je een PHP waarschuwing:

Warning: mysql_num_rows(): 80 is not a valid MySQL result resource 
in libraries\joomla\database\database\mysql.php on line 344

See also