Աշխատանք տվյալների բազայի հետ Drupal 7-ում - Դաս 4 - Դինամիկ հարցումներ (SELECT)
Հավանաբար մենք մոտեցել ենք Drupal-ի Database API-ի ամենահետաքրքիր հատվածին՝ դինամիկ հարցումներին: Դրանք անվանվում են դինամիկ, քանի որ Drupal-ը դինամիկ կերպով ավելացնում է հարցման տեքստը: Բոլոր ներմուծման, թարմացման, ջնջման կամ միավորման հարցումները կարող են լինել դինամիկ: Ընտրության հարցումները կարող են լինել թե՛ դինամիկ, թե՛ ստատիկ: Այնուամենայնիվ, խորհուրդ է տրվում օգտագործել դինամիկ հարցումներ՝ նույնիսկ ընտրության համար:
Բոլոր դինամիկ հարցումները ստեղծվում են որպես հարցման օբյեկտներ, որոնք կանչվում են անհրաժեշտության դեպքում: Ինչպես ստատիկ հարցումների դեպքում, այստեղ նույնպես հարցումների ճնշող մեծամասնությունը կիրառում է գործընթացային փաթեթավորիչ (procedural wrapper): Հարցման մնացած բոլոր պարամետրերը կարող են ավելացվել այդ հարցման օբյեկտում:
db_select() — ընտրության հարցումներ
Դինամիկ ընտրության հարցումները սկսվում են db_select() ֆունկցիայով, օրինակ՝
<?php $query = db_select('node', 'n', $options); ?>
Այս օրինակում "node"-ը այն աղյուսակն է, որի հետ աշխատում ենք՝ SQL-ում դա համապատասխանում է FROM հրամանի մասին: Նկատեք, որ աղյուսակի անունը այլևս չի փակագծվում գրավիչ փակագծերով: Հարցումների կոնստրուկտորը ավտոմատ կերպով կփակագծի աղյուսակների անունները: Երկրորդ պարամետրը աղյուսակի մականունն է (alias): Եթե այն նշված չէ, ապա օգտագործվում է աղյուսակի անունը: $options զանգվածը ընտրովի է և համարժեք է ստատիկ հարցումներում օգտագործվող $options զանգվածին:
Դինամիկ ընտրության հարցումները կարող են լինել ինչպես շատ պարզ, այնպես էլ շատ բարդ: Մենք կուսումնասիրենք դրանց հետ աշխատանքի հիմնական սկզբունքները, սակայն հնարավոր է շատ ժամանակ անցկացնել՝ ուսումնասիրելով դրանց հնարավորությունները:
Մեկ այլ db_select() օրինակ
Ստորև բերված է ընտրության հարցման ևս մեկ հարաբերականորեն պարզ օրինակ՝ users աղյուսակից։ Շուտով մենք կքննարկենք ընտրության հարցումների տարբեր հատկանիշներ և ավելի բարդ հարցումներ՝ միավորումների (joins) կիրառմամբ։
<?php $query = db_select('users', 'u'); $query ->condition('u.uid', 0, '<>') ->fields('u', array('uid', 'name', 'status', 'created', 'access')) ->range(0, 50); $result = $query->execute(); ?>
Վերը բերված օրինակը համարժեք է հետևյալին՝
$result = db_query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");
Սա պարզեցված հարցման օրինակ է, որը օգտագործվում է օգտվողների ադմինիստրացման էջում և կարելի է դիտարկել՝ հետագա ուսումնասիրության համար։
Միավորումներ (Joins)
Մյուս աղյուսակի հետ միանալու համար օգտագործվում են join(), innerJoin(), leftJoin() կամ rightJoin() մեթոդները, օրինակ՝
<?php $table_alias = $query->join('user', 'u', 'n.uid = u.uid AND u.uid = :uid', array(':uid' => 5)); ?>
Այս օրինակում ավելացվում է INNER JOIN (որն օգտագործվում է լռելյայն) "user" աղյուսակի հետ՝ "u" մականունով: Join-ի ON պայմանն է "n.uid=u.uid AND u.uid = :uid", որտեղ :uid արժեքն է 5: Նկատեք, որ այստեղ օգտագործվում են փոխարինողներ՝ անվտանգության նկատառումներից ելնելով: Երբեք մի տեղադրեք փոփոխականներ ուղիղ հարցման մեջ՝ սա կարող է հանգեցնել SQL ներմուծման (injection): innerJoin(), leftJoin() և rightJoin() մեթոդներն աշխատում են իրենց համապատասխան join տեսակներով:
join() մեթոդի վերադարձվող արժեքը աղյուսակի մականունն է: Եթե տվյալ մականունն արդեն օգտագործվում է այլ աղյուսակի համար (բավականին հազվադեպ դեպք), ապա Drupal-ը կստեղծի այլ մականուն:
Նկատեք, որ join-ի առաջին արգումենտում օգտագործվում է աղյուսակի անունը, օրինակ՝ "user":
<?php $myselect = db_select('mytable') ->fields('mytable') ->condition('myfield', 'myvalue'); $alias = $query->join($myselect, 'myalias', 'n.nid = myalias.nid'); ?>
Դաշտեր (Fields, addField)
Ընտրության հարցմանը դաշտ ավելացնելու համար օգտագործվում է addField() մեթոդը՝
<?php $title_field = $query->addField('n', 'title', 'my_title'); ?>
Վերոնշյալ օրինակում մենք ընտրում ենք "title" դաշտը "n" աղյուսակից և տալիս ենք նրան "my_title" մականուն: Եթե դաշտի մականունը չի նշվում, ապա այն ավտոմատ կստեղծվի՝ որպես դաշտի անուն: Եթե նման մականուն արդեն կա, ապա կօգտագործվի "աղյուսակ_դաշտ" ձևաչափով տարբերակ՝ օրինակ "n_title": եթե սա ևս կա, կավելացվի համար՝ օրինակ "n_title_2":
Եթե դուք ստեղծում եք հարցում և չեք ապահովում մականունը, և լռելյայնը անհասանելի է, ուրեմն սխալ կա կոդում: hook_query_alter() իրագործելիս, եթե դուք չգիտեք ճշգրիտ մականունը, ապա օգտագործեք լռելյայն անունը:
Մի քանի դաշտեր ընտրելու համար պարզապես մի քանի անգամ կանչեք addField(): Դաշտերի հերթականությունը սովորաբար նշանակություն չունի, եթե դա չի ազդում գործնական տրամաբանության վրա:
Դուք կարող եք նաև օգտագործել fields() կարճ տարբերակը՝ միանգամից մի քանի դաշտ ավելացնելու համար՝
<?php $query->fields('n', array('nid', 'title', 'created', 'uid')); ?>
Այս հրամանը համարժեք է addField() կանչելուն 4 անգամ՝ յուրաքանչյուր դաշտի համար առանձին: Սակայն, fields() չի աջակցում դաշտերի մականուններ նշելու հնարավորությունը: Այն վերադարձնում է հարցման օբյեկտ՝ բոլոր մականունները ավտոմատ կերպով կստեղծվեն: Եթե ձեզ անհրաժեշտ է տալ հատուկ մականուններ, օգտագործեք addField():
Եթե կանչում եք fields() առանց դաշտերի, այն կաշխատի ինչպես "SELECT *":
<?php $query->fields('n'); ?>
Սա կավելացնի "n.*" հարցման դաշտերի մեջ: Բայց զգուշացեք՝ եթե տարբեր աղյուսակներում կան նույն անունով դաշտեր, դա կարող է բախումների հանգեցնել: Այդ պատճառով խորհուրդ չի տրվում օգտագործել SELECT *: