Աշխատանք տվյալների բազայի հետ Drupal 7-ում - Դաս 9 - Թարմացման հարցումներ
Թարմացման հարցումները միշտ պետք է օգտագործեն հարցման կոնստրուկտոր։ Տարբեր տվյալների բազաներ ունեն հատուկ մշակման մեթոդներ LOB (Large OBject, օրինակ՝ TEXT MySQL-ում) և BLOB (Binary Large OBject) դաշտերի համար, ուստի աբստրակցիայի մակարդակ անհրաժեշտ է, որպեսզի յուրաքանչյուր տվյալների բազայի վարորդ կարողանա ապահովել համապատասխան ֆունկցիոնալություն։
Թարմացման հարցումները պետք է սկսվեն db_update()
ֆունկցիայից՝
<?php $query = db_update('node', $options); ?>
Սա ստեղծում է թարմացման հարցման օբյեկտ, որը կփոխի մեկ կամ մի քանի գրառում node
աղյուսակում։ Ուշադրություն դարձրեք, որ չկան անհրաժեշտություն գրել աղյուսակի անունը կուրծքանշաններով, կոնստրուկտորը ինքն է դա մշակում։
Թարմացման հարցման օբյեկտը օգտագործում է fluent API, այսինքն՝ բոլոր մեթոդները (բացառությամբ execute()
) վերադարձնում են իրենք իրենց, ինչը թույլ է տալիս մեթոդները գրել շղթայաբար։ Շատ դեպքերում, սա նշանակում է, որ հարցման արդյունքը հնարավոր չէ վերագրել փոփոխականին։
Թարմացման հարցումը բաղկացած է թարմացվող դաշտերի և WHERE պայմանների զույգից։ WHERE պայմանների կառուցվածքը մենք մանրամասն կքննարկենք հաջորդ դասերում, իսկ այստեղ միայն հակիրճ կներկայացնենք։
Ստորև ներկայացված է թարմացման հարցման տիպիկ օրինակ՝
<?php /* Այս սարսափելի օրինակը ցույց է տալիս ինչպես թարմացնել node աղյուսակի գրառումները */ $num_updated = db_update('node') ->fields(array( 'uid' => 5, 'status' => 1, )) ->condition('created', REQUEST_TIME - 3600, '>=') ->execute(); ?>
Այս օրինակը համարժեք է հետևյալ SQL հարցմանը՝
UPDATE {node} SET uid=5, status=1 WHERE created >= 1221717405;
Օրինակում ներկայացված է բոլոր այն node
գրառումների թարմացումը, որոնք ստեղծվել են վերջին ժամվա ընթացքում՝ տալով uid=5
և status=1
արժեքներ։ fields()
մեթոդը ընդունում է միայն ասոցիատիվ զանգված, որը ցույց է տալիս, թե որ դաշտերն ինչ արժեք պետք է ստանան։ Ի տարբերություն insert
հարցման, այստեղ միայն ասոցիատիվ զանգվածներ են թույլատրվում։ Դաշտերի հերթականությունը կարևոր չէ։
execute()
մեթոդը վերադարձնում է փոփոխված տողերի քանակը։ Բայց հիշեք՝ այդ քանակը ցույց է տալիս միայն այն տողերը, որոնք իրապես փոփոխվել են։ Օրինակ, եթե արդեն իսկ կան uid=5
և status=1
ունեցող գրառումներ, ապա դրանք չեն փոփոխվի, ուստի չեն հաշվարկվի որպես փոփոխված։ Այսինքն՝ execute()
-ի վերադարձած արժեքը միշտ չէ, որ ցույց է տալիս այն տողերի քանակը, որոնք համապատասխանում են WHERE պայմանին։