تصویر شیرین عبدالهی

فانکشن db_merge که در دروپال پیاده سازی شده، نوی خاصی از این پیوند کوئری ها را تولید کرده که به آن UPSERT میگویند.که ترکیب UPDATE  و INSERT است.

اگر شرایط خاصی روی بدهد.برای مثال یک ردیف با یک پرایمری خاصی وجود داشته باشد ، به جای insert کردن ردیف جدید ، ردیف قبلی update میگردد.به چند مثال از این نوع توجه کنید.

 

<?php
db_merge('example')
  ->key(array('name' => $name))
  ->fields(array(
      'field1' => $value1,
      'field2' => $value2,
  ))
  ->execute();
?>

 

در مثال بالا ، کوئری روی جدول example اجرا میشود.بدین صورت که اگر در ستون name مقدار  $name وجود داشته باشد ، برای آن ردیف ستون های field2,field1 را بر اساس مقادیر داده شده آن update میکند.همچنین اگر ستون  name با مقدار $name وجود نداشته باشد، ردیف جدیدی در جدول اضافه کرده و مقادیر field2,field1,name را در آن قرار میدهد.

 

db_merge('example')
  ->insertFields(array(
      'field1' => $value1,
      'field2' => $value2,
  ))
  ->updateFields(array(
    'field1' => $alternate1,
  ))
  ->key(array('name' => $name))
  ->execute();

 

در این تکه کد نیز ، مانند حالت قبل ، وجود ردیفی با مقدار $name برای ستون name را چک میکند. با این تفاوت که اگر این ردیف در جدول وجود داشت ، مقدار ستون field1 را با مقدار داده شده در updateFields به روز رسانی میکند. و اگر ردیف وجود نداشت، ردیف با مقادیر field2,field1,name را با مقادیر داده شده در insertFields به جدول اضافه میکند.

 

db_merge('example')
  ->key(array('name' => $name))
  ->fields(array(
      'field1' => $value1,
      'field2' => $value2,
  ))
  ->expression('field1', 'field1 + :inc', array(':inc' => 1))
  ->execute();

 

در این مثال ، اگر name وجود داشته باشد ، مقدار field1 آن به اضافه ی 1 میشود و field2 نیز به روز رسانی میگردد. اگر وجود نداشته باشد ردیفی با مقادیر field2,field1,name به جدول اضافه میشود.

این مثال، روش خوبی برای درست کردن یک counter query است.

نکاتی که باید به آن توجه شود :

اگر ستونی در expression() آورده شود ، نسبت به update مقدم تر است.

اگر ستونی در update آورده شود ، فقط آن ستون ها، آن هم در صورتی که ردیف وجود داشته باشد، آپدیت شده و مابقی ستون ها دست نخورده باقی میمانند.

 

دیدگاه‌ها

تصویر Ehsan Mirsaeedi

Ehsan Mirsaeedi (تایید نشده)

ممنونو این تابع دروپالی طراحی بسیار خوبی دارد.
در مثالی که آخر زده شده است، بیان شده که فیلد 2 به روز رسانی می گردد. اما فکر می کنم در صورت وجود رکورد، فیلد 2 به روز رسانی نمی گردد و همان مقدار سابق را خواهد داشت.
با تشکر

تصویر شیرین عبدالهی

شیرین عبدالهی

ممنون از توجه شما ، ولی همانطور که گفتم ، فیلد2 نیز به روز رسانی میگردد.

افزودن نظر جدید