Աշխատանք տվյալների բազայի հետ Drupal 7-ում - Դաս 11 - MERGE հարցումներ
Միավորող հարցումները հատուկ հիբրիդ տեսակի հարցումներ են։ Չնայած SQL 2003-ում սահմանվել է այս հարցումների շարահյուսությունը, իրականում չկան տվյալների բազաներ, որոնք աջակցում են այդ շարահյուսությանը։ Այնուամենայնիվ, տվյալների բազաների մեծ մասը տրամադրում է այս ֆունկցիոնալության այլընտրանքային իրականացում՝ օգտագործելով յուրահատուկ շարահյուսություն։ Drupal-ում միավորող հարցման կոնստրուկտորը աբստրակցիա է իրականացնում այս գաղափարի շուրջ՝ կառուցելով այնպիսի օբյեկտ, որը հնարավոր կլինի կոմպիլացնել ըստ կոնկրետ բազայի առանձնահատկությունների։
Ընդհանուր իմաստով, միավորող հարցումը համատեղում է insert (ավելացման) և update (թարմացման) հարցումներ։ Եթե որոշակի պայման է կատարվում՝ արդեն գոյություն ունեցող գրառման համար, ապա կկատարվի թարմացման հարցումը։ Հակառակ դեպքում կկատարվի ավելացման հարցումը։ Շատ դեպքերում սա համարժեք է հետևյալին՝
<?php if (db_result(db_query("SELECT COUNT(*) FROM {example} WHERE id=:id", array(':id' => $id))->fetchField())) { // Կատարում ենք թարմացում՝ WHERE id = $id } else { // Կատարում ենք ավելացում՝ $id ավելացնելով id դաշտում } ?>
Իրականացման մեթոդը կտարբերվի տվյալների բազայից բազա։ Ուշադրություն դարձրեք՝ չնայած միավորող հարցումները իդեալում ատոմային գործողություններ են, գործնականում դրանք կարող են լինել կամ չլինել իսկապես ատոմային՝ կախված տվյալների բազայի իրագործումից։ Օրինակ՝ MySQL-ի դեպքում դա ատոմային է։
Պարզ օրինակ
<?php db_merge('example') ->key(array('name' => $name)) ->fields(array( 'field1' => $value1, 'field2' => $value2, )) ->execute(); ?>
Այս օրինակում օգտագործվում է «example» աղյուսակը։ «name» դաշտը օգտագործվում է որպես բանալի։ Եթե արդեն գոյություն ունի name = $name ունեցող գրառում, ապա կթարմացվեն field1 և field2։ Հակառակ դեպքում՝ կավելացվի նոր գրառում՝ $name, $value1, $value2 արժեքներով։
Պայմանով թարմացում
Եթե ցանկանում եք տարբեր արժեքներ ավելացնել՝ կախված գրառման գոյությունից, կարող եք կիրառել՝
<?php db_merge('example') ->key(array('name' => $name)) ->fields(array( 'field1' => $value1, 'field2' => $value2, )) ->updateFields(array( 'field1' => $alternate1, )) ->execute(); ?>
Եթե գրառումը գոյություն ունի, field1-ը կդրվի $alternate1 արժեքով։ Հակառակ դեպքում՝ field1 = $value1։
<?php db_merge('example') ->key(array('name' => $name)) ->fields(array( 'field1' => $value1, 'field2' => $value2, )) ->expression('field1', 'field1 + :inc', array(':inc' => 1)) ->execute(); ?>
Եթե գրառումը արդեն կա, ապա field1-ը կավելանա 1-ով։ Հարմար է հաշվիչի հարցումների համար։
Թարմացման բացառումներ
<?php db_merge('example') ->key(array('name' => $name)) ->fields(array( 'field1' => $value1, 'field2' => $value2, )) ->updateExcept('field1') ->execute(); ?>
Եթե գրառումը գոյություն ունի, ապա field1-ը չի թարմացվի։ Կթարմացվի միայն field2-ը։ Սակայն եթե գրառումը չկա՝ երկուսն էլ կավելացվեն։
Առաջնահերթություն
Որպեսզի հարցման իմաստը չխախտվի, կիրառվում են հետևյալ կանոնները.
expression()
-ը գերակայում է թե՛update()
, թե՛updateExcept()
-ին։- Եթե դաշտը նկարագրված է ինչպես update(), այնպես էլ updateExcept(), ապա updateExcept() անտեսվում է։
- Եթե
update()
օգտագործվում է, ապա միայն այդ դաշտերն են թարմացվում։
Ուշադրություն դարձրեք, հնարավոր է ստեղծել իմաստազուրկ merge հարցումներ, եթե կան հակասող կանոններ։