Ներդրման հարցումներ insert
Ներդրման հարցումները միշտ պետք է օգտագործեն հարցումների կառուցողի օբյեկտը։ Որոշ տվյալների բազաներում պահանջվում է հատուկ LOB (Large OBject, օրինակ՝ TEXT MySQL-ում) և BLOB (Binary Large OBject) դաշտերի մշակման մեխանիզմ, ուստի անհրաժեշտ է աբստրակցիայի մակարդակ, որպեսզի տվյալների բազայի տարբեր դրայվերներ կարողանան իրականացնել իրենց հատուկ մշակումը։
Ներդրման հարցումները սկսվում են insert() մեթոդի միջոցով հետևյալ կերպ.
$query = $connection->insert('mytable', $options);
Սա ստեղծում է ներդրման հարցման օբյեկտ, որը կտեղադրի մեկ կամ մի քանի գրառումներ «mytable» աղյուսակում։ Խնդրում ենք նկատի ունենալ, որ աղյուսակի անվան համար փափուկ փակագծեր չեն պահանջվում, քանի որ հարցումների կառուցողը ավտոմատ կկատարի դրա մշակումը։
Ներդրման հարցման օբյեկտը օգտագործում է ազատ API։ Դա նշանակում է, որ բոլոր մեթոդները (execute()-ը բացի) վերադարձնում են նույն հարցման օբյեկտը՝ թույլ տալով մեթոդների շղթայական կանչեր։ Շատ դեպքերում դա նշանակում է, որ հարցման օբյեկտը նույնիսկ պետք չէ պահպանել փոփոխականում։
Ներդրման հարցման օբյեկտը աջակցում է մի քանի տարբեր օգտագործման ձևերի՝ տարբեր կարիքների համար։ Ընդհանուր առմամբ, աշխատանքային հոսքը բաղկացած է դաշտերը նշելուց, որոնց մեջ պետք է կատարվի ներդրումը, այդ դաշտերի համար արժեքների սահմանումից և հարցման կատարմանից։ Ամենատարածված և խորհուրդ տրվող օգտագործման մոդելները ստորև են։
Կոմպակտ ձև
Ներդրման հարցումների մեծամասնության համար նախընտրելի ձևն է կոմպակտ ձևը՝
$result = $connection->insert('mytable') ->fields([ 'title' => 'Example', 'uid' => 1, 'created' => \Drupal::time()->getRequestTime(), ]) ->execute();
Սա կհասնի հետևյալ հարցման համարժեքին.
INSERT INTO {mytable} (title, uid, created) VALUES ('Example', 1, 1221717405);
Վերոնշյալ կոդը համախմբում է ներդրման գործընթացի հիմնական մասերը։
$connection->insert('mytable')
Այս տողը ստեղծում է նոր ներդրման հարցման օբյեկտ «mytable» աղյուսակի համար։
->fields([ 'title' => 'Example', 'uid' => 1, 'created' => \Drupal::time()->getRequestTime(), ])
fields() մեթոդը ընդունում է տարբեր ձևեր, բայց ամենից հաճախ օգտագործվում է ասոցատիվ զանգված՝ դաշտերի անուններով որպես բանալիներ և համապատասխան արժեքներով: Դա հանգեցնում է մեկ ներդրման հարցման։
->execute();
execute() մեթոդը հրամայում է հարցմանը կատարվել։ Եթե այն չի կանչվում, հարցումը չի կատարվում։
Ներդրման հարցման մյուս մեթոդներից տարբերվող, execute() վերադարձնում է ավտոինկրեմենտ դաշտի (hook_schema()-ում նշված հերթական տիպ) արժեքը, որը լրացվել է ներդրման հարցման ընթացքում, եթե այդպիսի դաշտ կա։ Այդ պատճառով արդյունքը վերագրում են $result փոփոխականին։ Եթե ավտոինկրեմենտ դաշտ չկա, execute()-ի վերադարձված արժեքը անորոշ է և վստահելի չէ։
Սա սովորաբար նախընտրելի ձևն է ներդրման հարցումների համար։
Դեգեներատիվ ձև
$result = $connection->insert('mytable') ->fields(['title', 'uid', 'created']) ->values([ 'title' => 'Example', 'uid' => 1, 'created' => \Drupal::time()->getRequestTime(), ]) ->execute();
Սա ավելի մանրամասն է նախորդ օրինակին համարժեք հարցումը և արդյունքը կլինի նույնը։
->fields(['title', 'uid', 'created'])
fields()-ը զանգվածի տեսքով օգտագործվելիս սահմանում է միայն այն դաշտերը, որոնք կօգտագործվեն հարցման մեջ, առանց արժեքներ նշանակելու։ Սա օգտակար է, երբ ներդրման հարցումն նախատեսվում է կատարվել քայլ առ քայլ։
->values([ 'title' => 'Example', 'uid' => 1, 'created' => \Drupal::time()->getRequestTime(), ])
values() մեթոդը ընդունում է ասոցատիվ կամ ինդեքսավորված զանգված: Ինդեքսավորված զանգվածի դեպքում արժեքների հերթականությունը պետք է համապատասխանի fields() դաշտերի հերթականությանը: Սովորաբար, ասոցատիվ զանգվածն ավելի ընթերցանելի է։
Այս ձևը քիչ է օգտագործվում, քանի որ կոմպակտ ձևն առավել հարմար է։ Շատ դեպքերում fields() և values() բաժանելու միակ նպատակը բազմափայլ հարցման իրականացումն է։
Բազմակի ներդրման ձև
Ներդրման հարցման օբյեկտը կարող է ընդունել մի քանի արժեքների հավաքածու՝ values() մեթոդը կարող է կանչվել մի քանի անգամ՝ հերթով ավելացնելու ներդրման գործողություններ: Ինչպես դա տեղի կունենա՝ կախված է տվյալների բազայի հնարավորություններից։ Հիմնականում՝ մի քանի ներդրման գործողությունները կատարվում են միասին՝ տվյալների ամբողջականությունն ու արագությունը ապահովելու համար։ MySQL-ում օգտագործվում է բազմամակարդակ ներդրման սինթաքս։
$values = [ [ 'title' => 'Example', 'uid' => 1, 'created' => \Drupal::time()->getRequestTime(), ], [ 'title' => 'Example 2', 'uid' => 1, 'created' => \Drupal::time()->getRequestTime(), ], [ 'title' => 'Example 3', 'uid' => 2, 'created' => \Drupal::time()->getRequestTime(), ], ]; $query = $connection->insert('mytable')->fields(['title', 'uid', 'created']); foreach ($values as $record) { $query->values($record); } $query->execute();
Վերը նշված օրինակով երեք ներդրման գործողությունները կկատարվեն միասին՝ օգտագործելով տվյալների բազայի համար առավել արդյունավետ մեթոդը։ Նշեք, որ այստեղ մենք պահպանեցինք հարցման օբյեկտը փոփոխականում, որպեսզի հնարավոր լինի կրկին multiple values() կանչ անել:
Դեգեներատիվ ձևով վերոնշյալը համարժեք է հետևյալ երեք հարցումներին.
INSERT INTO {mytable} (title, uid, created) VALUES ('Example', 1, 1221717405); INSERT INTO {mytable} (title, uid, created) VALUES ('Example2', 1, 1221717405); INSERT INTO {mytable} (title, uid, created) VALUES ('Example3', 2, 1221717405);
Նշեք, որ բազմակի ներդրման հարցումների դեպքում execute()-ի վերադարձված արժեքը անորոշ է և չպետք է վստահել, քանի որ կարող է տարբերվել տվյալների բազայի դրայվերից կախված։
Ներդրում select հարցման արդյունքներից
Եթե ցանկանում եք լրացնել աղյուսակը այլ աղյուսակների արդյունքներով, կարող եք կամ անել SELECT հարցում սկզբնական աղյուսակներից, պտտել արդյունքները PHP-ում և հետո ներդնել նոր աղյուսակում, կամ կատարել INSERT INTO ... SELECT FROM հարցում, որի միջոցով SELECT-ից վերադարձված յուրաքանչյուր գրառում ներդրվում է INSERT հարցման մեջ։
Այս օրինակով ցանկանում ենք ստեղծել «mytable» աղյուսակը, որը կպահի բոլոր համակարգի page տիպի հանգույցների nid և օգտատերերի անունները։
<?php // Ստեղծել SELECT հարցումը։ $query = $connection->select('node', 'n'); // Միացնել users աղյուսակին։ $query->join('users', 'u', 'n.uid = u.uid'); // Հավելել անհրաժեշտ դաշտերը։ $query->addField('n','nid'); $query->addField('u','name'); // Պայման, որ վերցնի միայն page տիպի հանգույցները։ $query->condition('type', 'page'); // Կատարվել ներդրումը։ $connection->insert('mytable') ->from($query) ->execute(); ?>
Նախնական արժեքներ
Սովորաբար, եթե դաշտի համար արժեք չի նշվում և աղյուսակի սխեմայում որոշված է նախնական (default) արժեք, տվյալների բազան ավտոմատ կդնի այդ արժեքը: Սակայն երբեմն անհրաժեշտ է, որ տվյալների բազան միանշանակ օգտագործի նախնական արժեքը: Սա հատկապես օգտակար է, եթե ցանկանում եք, որ բոլոր դաշտերը ստանան իրենց նախնական արժեքները: Այս նպատակով գոյություն ունի useDefaults() մեթոդը:
$query->useDefaults(['field1', 'field2']);
Այս տողը հարցմանն ասում է, որ օգտագործի նշված դաշտերի նախնական արժեքները: Խնդրում ենք նկատի ունենալ, որ նույն դաշտը չպետք է միաժամանակ հայտնվի useDefaults() և fields() կամ values() զանգվածներում, հակառակ դեպքում կառաջանա բացառություն։
$connection->insert() կամ $connection->query()
Սա հաճախ տրվող հարց է։ (Դիտեք մեկնաբանությունները այս էջում) Ինչ տարբերություն կա insert() և query() մեթոդների միջև։
insert() մեթոդը յուրաքանչյուր սյունակ ցույց է տալիս որպես դաշտերի զանգվածի տարր, և կոդը կարող է ստուգել և մաքրել յուրաքանչյուր դաշտի արժեքները: query()-ն օգտագործում է SQL-ի միանգամյա տող առանց դաշտերի ստուգման հնարավորության: query()-ը կարող է օգտագործվել նաև պարամետրային տեղատառերով, բայց դա ուղղակի տարբերակ է, և չկա երաշխիք, որ SQL-ում չկան չվերամշակված արժեքներ։
insert()-ը անցկացնում է հարցումը հուքերի միջով՝ թույլ տալով այլ մոդուլներին ստուգել և փոփոխել հարցումները, ինչը ճիշտ և անվտանգ ձև է մոդուլների հետ աշխատանքում։ query()-ն արագ է, քանի որ չի անցկացնում հարցումը հուքերով, բայց դա թույլ չի տալիս այլ մոդուլներին օգնել ձեր կոդին։
insert() ավելի լավ է աշխատում տարբեր տվյալների բազաների և Drupal-ի ապագա տարբերակների հետ։
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.