Աշխատանք տվյալների բազայի հետ 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()-ում նշել, կստանաք սխալ։