Աշխատանք տվյալների բազայի հետ Drupal 7-ում - Դաս 8 - Հարցումների ներմուծում (INSERT INTO)
Տեղադրման հարցումները միշտ պետք է իրականացվեն հարցումների կոնստրուկտորի միջոցով։ Որոշ տվյալների բազաներ պահանջում են հատուկ մշակման եղանակներ LOB (Large Object, օրինակ՝ MySQL-ում տեքստ) և BLOB (Binary Large Object) դաշտերի համար, այդ պատճառով անհրաժեշտ է աբստրակցիայի մակարդակ, որպեսզի յուրաքանչյուր տվյալների բազայի (ԴԲ) վարորդ կարողանա իրականացնել համապատասխան մշակման մեթոդները։
Տեղադրման հարցումը սկսվում է db_insert()
ֆունկցիայի օգտագործմամբ՝
<?php $query = db_insert('node', $options); ?>
Այս հարցումը ստեղծում է հարցման օբյեկտ, որը կտեղադրի մեկ կամ մի քանի գրառում node
աղյուսակում։ Ուշադրություն դարձրեք, որ աղյուսակների անունները գրելու անհրաժեշտություն չկա՝ կուրծքանշաններով, քանի որ կոնստրուկտորը դա կառավարում է ինքնուրույն։
Տեղադրման հարցումները օգտագործում են շղթայված (fluent) API, այսինքն՝ բոլոր մեթոդները, ներառյալ execute()
-ը, վերադարձնում են նույն օբյեկտը՝ հնարավորություն տալով մեթոդները շղթայաբար կիրառել։
Կարճ գրառում (Compact form)
Նախընտրելի ձեւ մեծ մասի համար՝
<?php $nid = db_insert('node') ->fields(array( 'title' => 'Example', 'uid' => 1, 'created' => REQUEST_TIME, )) ->execute(); ?>
Սա հավասարազոր է հետևյալ SQL հարցմանը՝
INSERT INTO {node} (title, uid, created) VALUES ('Example', 1, 1221717405);
fields()
մեթոդը ընդունում է ասոցիատիվ զանգված, որտեղ բանալիները աղյուսակի դաշտերն են, իսկ արժեքները՝ տվյալները։
execute()
-ը՝ ի տարբերություն այլ մեթոդների, վերադարձնում է ավտոաճող դաշտի (օր.՝ nid) արժեքը։ Եթե նման դաշտ չկա, վերադարձվող արժեքին չպետք է վստահել։
Պարզեցված ձև (Degenerate form)
<?php $nid = db_insert('node') ->fields(array('title', 'uid', 'created')) ->values(array( 'title' => 'Example', 'uid' => 1, 'created' => REQUEST_TIME, )) ->execute(); ?>
Եթե fields()
ընդունում է ցուցակ, ապա values()
-ում պետք է ապահովել նույն հերթականությունը։ Բայց եթե values()
-ում օգտագործվում է ասոցիատիվ զանգված, ապա կարգը կարևոր չէ։ Այս ձևն օգտագործվում է multi-insert հարցումների դեպքում։
Multi-insert հարցում (Multiple row insert)
Կարող եք միաժամանակ մի քանի արժեքներ տեղադրել՝ values()
կոչելով մի քանի անգամ։ Օրինակ՝
<?php $values = array( array( 'title' => 'Example', 'uid' => 1, 'created' => REQUEST_TIME, ), array( 'title' => 'Example 2', 'uid' => 1, 'created' => REQUEST_TIME, ), array( 'title' => 'Example 3', 'uid' => 2, 'created' => REQUEST_TIME, ), ); $query = db_insert('node')->fields(array('title', 'uid', 'created')); foreach ($values as $record) { $query->values($record); } $query->execute(); ?>
Սա կկատարի երեք տեղադրում մեկ հարցման մեջ՝ ապահովելով արագություն և արդյունավետություն։ Բայց execute()
-ը այս դեպքում չի վերադարձնում վստահելի արժեք։
Տեղադրում՝ հիմնված SELECT հարցման վրա (INSERT INTO ... SELECT)
Երբ ցանկանում եք լրացնել աղյուսակ SELECT-ի արդյունքով, կարող եք օգտագործել հետևյալ ձևը (Drupal 7)՝
<?php $query = db_select('node', 'n'); $query->join('users', 'u', 'n.uid = u.uid'); $query->addField('n','nid'); $query->addField('u','name'); $query->condition('type', 'page'); db_insert('mytable') ->from($query) ->execute(); ?>
Սա կատարում է՝ INSERT INTO mytable (nid, name) SELECT ...
Լռելյայն արժեքներ (Defaults)
Եթե ցանկանում եք հարկադրել որոշ դաշտերի համար օգտագործել տվյալների բազայի լռելյայն արժեքները, կարող եք գրել՝
<?php $query->useDefaults(array('field1', 'field2')); ?>
Սա կստիպի, որ field1
և field2
դաշտերի համար օգտագործվեն աղյուսակի լռելյայն արժեքները։ Եթե փորձեք միևնույն դաշտը և fields()
/values()
-ում, և useDefaults()
-ում նշել, կստանաք սխալ։