Ներդրում դինամիկ հարցումների մեջ
Դինամիկ հարցումները վերաբերում են այն հարցումներին, որոնք Drupal-ը ստեղծում է դինամիկ, այլ ոչ թե ներկայացված են որպես հստակ SQL տող: Ներդրման, թարմացման, ջնջման և սինթեզման բոլոր հարցումները պետք է լինեն դինամիկ: Ընտրողական հարցումները կարող են լինել ստատիկ կամ դինամիկ: Այսպիսով, «դինամիկ հարցում» սովորաբար նշանակում է դինամիկ Select հարցում։
Նշում․ սելեկտ հարցումների 90% դեպքերում դուք կունենաք ստատիկ հարցումներ: Եթե աշխատողականության կարևոր ուղու մեջ եք, պետք է օգտագործեք query() մեթոդը select()–ի փոխարեն կատարողականի նկատառումներով: Դինամիկ հարցումներ օգտագործեք միայն այն ժամանակ, երբ հարցման մասերը տարբեր են (օրինակ՝ WHERE պայմաններ ավելացնել կոնտեքստի հիման վրա) կամ պետք է փոփոխելի լինեն։
Բոլոր դինամիկ հարցումները ստեղծվում են տվյալների բազայի համապատասխան կապի օբյեկտից ստացված հարցման օբյեկտի միջոցով։ Ինչպես ստատիկ հարցումների դեպքում, մեծ մասամբ հարցման օբյեկտը կարող է ստեղծվել պրոցեդուրալ շապիկով, բայց հետագա հարցման հրահանգները մեթոդներ են, որոնք կանչվում են այդ օբյեկտի վրա։
Դինամիկ ընտրության հարցումները սկսվում են select() մեթոդով հետևյալ կերպ.
$database = \Drupal::database(); $query = $database->select('mytable', 'mt', $options);
Այստեղ mytable-ը հարցման հիմնական աղյուսակն է՝ FROM օպերատորից հետո առաջինը։ Խնդրում ենք նկատի ունենալ, որ դրա շուրջ փակագծեր չպետք է լինեն։ Հարցումների կառուցողը դա ավտոմատ կիրականացնի։ Երկրորդ պարամետրը աղյուսակի պսևդոնիմն է։ Եթե այն նշված չէ, օգտագործվում է աղյուսակի անունը։ $options զանգվածը պարտադիր չէ և համանման է ստատիկ հարցումների $options զանգվածին։
$database->select()–ի վերադարձվող արժեքը Select տեսակի օբյեկտ է, ուստի $query փոփոխականի տիպը Select օբյեկտ է։ Այս օբյեկտը ունի fields(), joins(), group() և այլ մեթոդների ամբողջական ցանկ՝ հարցումը ճշգրտելու համար։
Դինամիկ ընտրության հարցումները կարող են լինել շատ պարզ կամ շատ բարդ։ Ստորև կքննարկենք պարզ հարցման բաղադրիչները, իսկ հաջորդ էջերում՝ բարդ մեթոդները, օրինակ՝ միացումները։
Ընդհանուր պատկեր
Ահա բավական պարզ հարցում օգտվողների աղյուսակից։
Ամենայն հավանականությամբ ուզում ենք ստեղծել դինամիկ հարցում, որը մոտավորապես հավասար է հետևյալ ստատիկ հարցմանը՝
$result = $database->query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");
Դինամիկ համարժեքը սկսվում է այսպես՝
// Ստեղծել Select օբյեկտ $database = \Drupal::database(); $query = $database->select('users', 'u'); // Ավելացնել մանրամասներ՝ պայման, դաշտեր և տիրույթ $query->condition('u.uid', 0, '<>'); $query->fields('u', ['uid', 'name', 'status', 'created', 'access']); $query->range(0, 50);
Սա հաճախ գրանցվում է կարճացված ձևով՝ միանգամից մի քանի մեթոդների շղթայական կանչով, այդ պատճառով հաճախ օգտագործվում է հետևյալ ձեւը.
// Ստեղծել Select օբյեկտ $query = $database->select('users', 'u'); // Ավելացնել մանրամասներ՝ պայման, դաշտեր և տիրույթ $query->condition('u.uid', 0, '<>') ->fields('u', ['uid', 'name', 'status', 'created', 'access']) ->range(0, 50);
Իրականում, կարելի է և հաճախ արվում է մեկ քայլ էլ կրճատել՝ $database->select() կանչն անմիջապես շղթայական մեթոդների կանչին միացնելով։ Ստացվում է.
// Ստեղծել Select օբյեկտ և անմիջապես ավելացնել մանրամասներ՝ $query = $database->select('users', 'u') ->condition('u.uid', 0, '<>') ->fields('u', ['uid', 'name', 'status', 'created', 'access']) ->range(0, 50);
Սա պարզեցված հարցման ձևն է, որն օգտագործվում է օգտվողների ադմինիստրացիայի էջում, և կարող է ծառայել որպես օրինակ։
Հարցման կատարում
Հարցումը կառուցելուց հետո կանչեք execute() մեթոդը՝ հարցումը կոմպիլացնելու և կատարելու համար։
$result = $query->execute();
execute() մեթոդը կվերադարձնի արդյունքների հավաքածուի օբյեկտ, որը նույնն է $database>query()–ի վերադարձվող օբյեկտին, և կարելի է օգտագործել նույն կերպ՝
$result = $query->execute(); foreach ($result as $record) { // Ամեն գրառման հետ կատարել գործողություն }
Նշում․ Լուրջ զգուշություն ցուցաբերեք հետևյալ մեթոդների օգտագործման ժամանակ բազմադաշտ դինամիկ հարցումների դեպքում՝
Այս մեթոդները ներկայում պահանջում են սյունակի թվային ինդեքսներ (0, 1, 2 և այլն), ոչ թե աղյուսակի պսևդոնիմներ։ Սակայն հարցումների կառուցողը չի երաշխավորում դաշտերի որոշակի հերթականություն, ուստի սյունակների դիրքը կարող է տարբերվել ձեր սպասածից։ Հատկապես արտահայտությունները միշտ ավելացվում են դաշտերից հետո, նույնիսկ եթե նախապես հարցման մեջ ավելացվել են։ (Այս խնդիրն առնչվում չէ ստատիկ հարցումներին, որոնք միշտ դաշտերը վերադարձնում են նշված հերթականությամբ։)
Վերահսկում (Debug)
SQL հարցումը ուսումնասիրելու համար, որը օգտագործվում է հարցման օբյեկտի կողմից իր կյանքի ընթացքում, պարզապես տպեք հարցման օբյեկտը։ Հարցման արգումենտները ստուգելու համար օգտագործեք arguments() մեթոդը, որը վերադարձնում է զանգված։
echo $query; print_r($query->__toString()); print_r($query->arguments());
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.