meerdere queries tegelijk uitvoeren

  • Robert
  • Onderwerp Auteur
  • Gebruiker
  • Gebruiker
  • Robert is Joomla!-ontwikkelaar bij Yolknet, een bedrijf dat klanten ontzorgt met een breed aanbod aa
Meer
06 jun 2015 14:52 #7132 door Robert
meerdere queries tegelijk uitvoeren werd gestart door Robert
In een foreach-loop worden de waarden in de database opgeslagen. Dat kan door bij elk item een query uit te voeren, maar efficiënter zou zijn om de queries bijv. in een array te plaatsen en die aan het eind van de loop in 1 keer uit te laten voeren.
In de documentatie kan ik niet vinden hoe dit moet. Weet iemand het antwoord?

Yolknet - all for web
Discussie gesloten.
  • Gast
  • Gebruiker
  • Gebruiker
Meer
06 jun 2015 14:52 #7133 door Gast
Beantwoord door Gast in topic meerdere queries tegelijk uitvoeren
Denk niet dat het per definitie efficiënter is. Uiteindelijk worden de queries alsnog één voor één los uitgevoerd.

Wil je het toch doen dan is het wel mogelijk. Als je kijkt naar de documentatie kan je zien dat de query een variabele is:
[PHP]$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');[/PHP]

Deze query wordt dan ook weer uitgevoerd door de variabele aan te spreken:
[PHP]$db->setQuery($query);[/PHP]

Het enige dat je hoeft te doen is gedurende de foreach de array te vullen met queries. Je kan die later in een foreach weer een voor een vullen.

Maar zoals gezegd denk ik niet dat je hier enige efficiëntie mee gaat behalen, het eindresultaat is alsnog dat je een aantal queries los uitvoert. Wat ik aanraad is gedurende de originele foreach één grote query op te bouwen en deze in eenmaal uit te voeren. Meer informatie vind je hier .
Discussie gesloten.
  • Gast
  • Gebruiker
  • Gebruiker
Meer
06 jun 2015 14:52 #7134 door Gast
Beantwoord door Gast in topic meerdere queries tegelijk uitvoeren
In dit geval is het wel efficiënter om 1 query in een loop te produceren: het gaat immers om het inserten (of eventueel updaten) van gegevens, niet om het uit de database halen van gegevens.

Bij een INSERT met de Joomla Querybuilder (die JDatabaseQuery) kun je de values()-method meerdere keren aanroepen. Stel je voor je wil in kolom1, kolom2 en kolom3 een aantal keer een waarde1, waarde2 en waarde3 zetten, dan krijg je dus zoiets:
[PHP]
$query ->insert($db->quoteName('#__jouw_tabel')) ->columns($db->quoteName($columns));

// en dan het loopje
foreach ($waardes as $waarde)
{
$query->values($waarde->veld1, $waarde->veld2, $waarde->veld3);
}
[/PHP]

Methode simpel: je hoeft niet de Joomla querybuilder te gebruiken. Dit kan b.v. als je een custom applicatie maakt, niet eentje die je ook aan anderen ter beschikking stelt (b.v. via de JED), en waarvan je zeker weet dat die nooit anders dan op MySql gebruikt wordt. Die querybuilder is vooral handig omdat die uiteindelijk een querystring maakt die geschikt is voor de gebruikte database. Als je een native MySql query bouwt, dan krijg je dus zoiets:
[PHP]
$query = "INSERT INTO #__jouw_tabelnaam
(`colomnaam1`, `colomnaam2`, etc...)
VALUES ";

/ / en dan het loopje

foreach ($waardes as $waarde)
{
$query .= '(' . $waarde->veld1 . ',' . $waarde->veld2 . ',' . $waarde->veld3 . ')';
}
[/PHP]

In beide gevallen nog even $db->quote() om die waardes heen.

UPDATE is wat lastiger als 1 statement achter elkaar te plakken. Het is eventueel wel mogelijk om in MySql meerdere UPDATE statements in 1 query plakken, gescheiden met een punt-komma, maar waarschiijnlijk geeft dat meer problemen dan het oplost. Bovendien kan Joomla's $db->execute() volgens mij maar 1 statement aan. Waarschijnlijk dat het bij een UPDATE dus wel gemakkelijker is om meerdere database-calls achtereenvolgens uit te voeren.


Bericht toegevoegd op 7 juni 2015 om 20:53
Vorige bericht was op 7 juni 2015 om 20:41


Alleen dan wel met een komma tussen die tuples met (waarde1, waarde2, waarde3), dus het gemakkelijkste door in een array te zetten en dan te imploden met een komma ertussen.
Discussie gesloten.
Gemaakt door Kunena