logo

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

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

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

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

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

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

Scroll
18/06/2025, by Ivan

Սինթեզման հարցումները հանդիսանում են հիբրիդային հարցումների հատուկ տեսակ: Չնայած դրանց սինթաքսը սահմանված է SQL 2003 սպեցիֆիկացիայում, բայց գրեթե որևէ տվյալների բազա չի աջակցում ստանդարտ սինթաքսը: Այնուամենայնիվ, դրանց մեծամասնությունը տրամադրում է այլընտրանքային իրականացում՝ տվյալների բազային հատուկ սինթաքսի միջոցով: Drupal-ում սինթեզման հարցումների կառուցողը այս հասկացությունը բերում է կառուցվածքային օբյեկտի, որը կարող է կոմպիլացվել համապատասխան սինթաքսով յուրաքանչյուր տվյալների բազայի համար: Դրանք երբեմն կոչվում են "UPSERT" հարցումներ, որոնք UPDATE և INSERT-ի համադրման արդյունք են։

Ընդհանուր իմաստով սինթեզման հարցումը համադրում է ներդրման (INSERT) և թարմացման (UPDATE) հարցումները: Եթե մի պայման կատարվում է, օրինակ՝ տվյալ նախնական բանալով տող արդեն գոյություն ունի, կատարվում է թարմացման հարցումը: Եթե ոչ, կատարվում է ներդրման հարցումը: Հաճախակի օգտագործման դեպքում դա համարժեք է հետևյալին:

if ($connection->query("SELECT COUNT(*) FROM {example} WHERE id = :id", [':id' => $id])->fetchField()) {
  // Կատարել թարմացում WHERE id = $id պայմանով
}
else {
  // Կատարել ներդրում, id-ի համար տալով $id
}

Իրական իրականացումը ուժեղորեն տարբերվում է տվյալների բազայից տվյալների բազայի: Հիշեք, որ չնայած սինթեզման հարցումները բովանդակային առումով տարրական օպերացիա են, բայց իրականում կարող են լինել կամ չլինել ատոմար՝ կախված տվյալների բազայի կոնկրետ իրականացումից: Օրինակ, MySQL-ի իրականացումը առանձին ատոմար հարցում է, բայց վերևում նշված դեպքը՝ ոչ:

Սինթեզման հարցումների ամենատարածված օրինակներն ամբողջությամբ տրված են ստորև։

Պարզապես սահմանեք այն

$connection->merge('example')
  ->key('name', $name)
  ->fields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->execute();

Վերը նշված օրինակով մենք ասում ենք հարցման կառուցողին աշխատել «example» աղյուսակի հետ: Հետո սահմանում ենք մեկ բանալին՝ 'name'՝ արժեքով $name: Հետո տալիս ենք արժեքների զանգված՝ սահմանելու համար։

Եթե արդեն գոյություն ունի տող, որտեղ «name» դաշտի արժեքը $name է, ապա այդ գոյություն ունեցող տողում field1 և field2 դաշտերը կստանան համապատասխան արժեքները: Եթե այդպիսի տող չկա, ստեղծվում է տող, որտեղ name = $name, field1 = $value1, և field2 = $value2: Այսպիսով, հարցման վերջնական արդյունքը նույնն է՝ անկախ նրանից, կար արդյոք այդ տողը թե ոչ:

Պայմանական նշանակումներ

Որոշ դեպքերում անհրաժեշտ է դաշտերի արժեքները սահմանել տարբեր կերպ՝ կախված նրանից, արդյոք գրառումը արդեն գոյություն ունի, ինչպես սահմանված է key() դաշտերով: Այս խնդիրն ունի երկու լուծում։

$connection->merge('example')
  ->insertFields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->updateFields([
    'field1' => $alternate1,
  ])
  ->key('name', $name)
  ->execute();

Վերը նշված օրինակով վարքը նման է առաջինին, բացառությամբ, որ եթե գրառումը արդեն գոյություն ունի և մենք թարմացնում ենք այն, ապա field1 դաշտի համար կսահմանվի $alternate1 արժեքը $value1-ի փոխարեն, իսկ field2 դաշտը փոփոխության չի ենթարկվի: updateFields() մեթոդը ընդունում է կամ մի ասոցատիվ զանգված արժեքներով, կամ երկու զուգահեռ թվային զանգված՝ դաշտերի և համապատասխան արժեքների, որոնք պետք է նույն հերթականությամբ լինեն։

$connection->merge('example')
  ->key('name', $name)
  ->fields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->expression('field1', 'field1 + :inc', [':inc' => 1])
  ->execute();

Այս օրինակում, եթե գրառումը արդեն գոյություն ունի, field1 դաշտի արժեքը կսահմանվի որպես նրա ներկա արժեքը գումարած 1: Սա շատ օգտակար է "հակադարձ հարցումների" (counter queries) համար, երբ ցանկանում եք տվյալների բազայում ամեն անգամ որոշակի իրադարձության դեպքում միացնելի կոնտեքստով հաշվիչ ավելացնել: field2 դաշտը նույն արժեքը կպահի անկախ գրառման գոյությունից։

Ուշադրություն դարձրեք, որ expression() մեթոդը կարող է կանչվել մի քանի անգամ, յուրաքանչյուրը մեկ դաշտի համար, եթե այն դաշտը պետք է սահմանվի արտահայտությամբ, երբ գրառումը արդեն գոյություն ունի: Առաջին պարամետրը դաշտն է, երկրորդը՝ SQL արտահայտությունը, որ պետք է նշանակվի դաշտին, իսկ երրորդ՝ կամայական պարամետրերի զանգվածը արտահայտության մեջ տեղադրելու համար։

Բացի այդ, expression() դաշտը պարտադիր չէ արդեն ընդգրկված լինի fields() մեջ։

Վերոնշյալ API-ի հիման վրա հնարավոր է սահմանել հարցումներ, որոնք տրամաբանական իմաստ չունեն, օրինակ՝ երբ դաշտը և՛ անտեսվում է, և՛ սահմանվում արտահայտությամբ, եթե գրառումը արդեն գոյություն ունի: Սխալները նվազագույնի հասցնելու համար գործում են հետևյալ կանոնները՝

  • Եթե դաշտին սահմանված է expression(), այն առավելություն ունի updateFields() նկատմամբ։
  • Եթե updateFields()-ում նշված են արժեքներ, ապա միայն այդ դաշտերը կթարմացվեն, եթե գրառումը արդեն գոյություն ունի: Այլ դաշտերը փոփոխության չեն ենթարկվի։

Ուշադրություն դարձրեք, որ դեռ հնարավոր է սահմանել տրամաբանական իմաստ չունեցող հարցումներ: Զարգացուցիչը պետք է համոզվի, որ նման հարցումներ չեն սահմանվում, քանի որ այդ դեպքում վարքը չսահմանված է։

Source URL:

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.