Լրացուցիչ Բլոկների Տեսակներ (EBT) - Դասավորության Կառուցողի նոր փորձառություն❗

Լրացուցիչ Բլոկների Տեսակներ (EBT) - ձևավորված, կարգավորելի բլոկների տեսակներ՝ սլայդշոուներ, ներդիրներ, քարտեր, բացվող ցանկեր և շատ ուրիշներ։ Ներառված կարգավորումներ՝ ֆոնի, DOM տուփի, JavaScript փլագինների համար։ Փորձեք դասավորությունների կառուցման ապագան արդեն այսօր։

EBT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EBT մոդուլները

❗Լրացուցիչ Պարբերությունների Տեսակներ (EPT) - Պարբերությունների նոր փորձառություն

Լրացուցիչ պարբերության տեսակներ (EPT) - անալոգիական պարբերության վրա հիմնված մոդուլների հավաքակազմ։

EPT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EPT մոդուլները

Scroll

Աշխատանք տվյալների բազայի հետ Drupal 7-ում - Դաս 11 - MERGE հարցումներ

12/05/2025, by Ivan

Միավորող հարցումները հատուկ հիբրիդ տեսակի հարցումներ են։ Չնայած 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 հարցումներ, եթե կան հակասող կանոններ։