Db_select () ব্যবহার করে নির্মিত ক্যোয়ারীটি মুদ্রণ করুন


61

আমি ক্যোয়ারীটি মুদ্রণ করতে চাই যা একটি প্রোগ্রাম্যাটিক পদ্ধতিতে db_select () ব্যবহার করে নির্মিত । ড্রুপাল অ্যাবস্ট্রাকশন স্তর দ্বারা সরবরাহ করা কোনও এপিআই ফাংশন রয়েছে?
এটি ভিউজে কোয়েরি আউটপুটটির অনুরূপ, তবে আমি এটি ডিবাগ করার উদ্দেশ্যে আমার কাস্টম মডিউল থেকে মুদ্রণ করতে চাই।

উত্তর:


67

SelectQueryপ্রয়োগগুলি SelectQuery::__toString(), যা প্রসঙ্গে বলা হয় যেখানে স্ট্রিং প্রয়োজন।

নিম্নলিখিত কোড বিবেচনা করুন।

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print $query;

এর আউটপুট নিম্নলিখিত এক।

SELECT block.*
FROM 
{block} block
WHERE  (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)

ক্যোয়ারির জন্য ব্যবহৃত আর্গুমেন্টের অ্যারে পেতে, আপনি কল করতে পারেন SelectQuery::arguments()

নিম্নলিখিত কোডটি ডিভেল মডিউল থেকে উপলব্ধ ফাংশনগুলি ব্যবহার করে ক্যোয়ারী এবং তার যুক্তিগুলি মুদ্রণ করে।

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

dpm((string) $query);
dpm($query->arguments());

স্ক্রিনশট

যদিও ডিভেল মডিউলটি প্রয়োজনীয় নয় এবং আপনি drupal_set_message()আউটপুটটি প্রদর্শন করতে পারেন। উদাহরণস্বরূপ, স্থানধারকদের আসল মান দ্বারা প্রতিস্থাপনের সাথে একটি স্ট্রিং পেতে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন।

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

পূর্বের উদাহরণ কোডটি আমি দেখিয়েছি যে নিম্নলিখিতটি হয়ে উঠবে।

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

drupal_set_message(format_string('Query: %query', array('%query' => _get_query_string($query))));

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

লক্ষ করুন যে, SelectQuery::arguments()ক্যোয়ারী আর্গুমেন্ট অ্যারে ফেরৎ শুধুমাত্র যখন পরে বলা হয় SelectQuery::__toString(), SelectQuery::compile()অথবা SelectQuery::execute(); অন্যথায়, SelectQuery::arguments()ফেরত NULL

স্ট্রিং কোয়েরিটি পেতে আপনি নীচের মত অনুরূপ একটি ফাংশন ব্যবহার করতে পারেন, স্থানধারীদের যুক্তি দিয়ে প্রতিস্থাপন করা হয়েছে।


1
আমি মনে করি যে একটি ফাংশন ইন্টারফেসের _get_query_string()অংশ হওয়া উচিত ছিল SelectQuery
দশোহক্সা

46

আপনি কোয়েরিটি প্রদর্শনের জন্য dpq () এবং ফলাফলটি প্রদর্শনের জন্য dpr () ব্যবহার করতে পারেন ।

  $query = db_select('users','u');
  $query->fields('u');
  $query->condition('u.uid', 1042);
  $result = $query->execute()->fetchAll();

  dpq($query); // Display the query. 
  dpr($result); // Display the query result.

1
মনে রাখবেন যে এটির জন্য ডিভেল মডিউলটি ইনস্টল করা দরকার। আপনি যদি ডেভেল ব্যবহার করেন (আমি এটি পছন্দ করি) তবে এটি যাওয়ার সহজতম উপায়।
জো_ফ্ল্যাশ

2
dpq () আপনি আমার সারা জীবন কোথায় ছিলেন!
লোম্যাক্স

try catchকোয়েরি ব্যর্থ হলে কোনও ব্লকে কাজ করতে উপস্থিত হয় না । সুতরাং আমি যদি ভাঙা কোয়েরিটি ডিবাগ করতে না পারি তবে আমার ক্ষেত্রে সহায়ক নয়।
কিয়ে

19

আরেকটি বিকল্প হ'ল:

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print strtr((string) $query, $query->arguments());

2
সংক্ষিপ্ত এবং সংক্ষিপ্ত প্রকৃতপক্ষে।
দশোহক্সা

2
কোনও ফোলা / তৃতীয় পক্ষের মডিউলগুলির প্রয়োজন নেই। এছাড়াও এটি কার্যকর করা হয়নি এমন প্রশ্নের উপর কাজ করে, সুতরাং আপনি এমন একটি ক্যোয়ারী মুদ্রণ করতে পারেন যা ব্যর্থ হয় এবং ত্রুটি দেয়, dpqএমনকি চেষ্টা / ধরার ক্ষেত্রেও এটি অনুমতি দেয় বলে মনে হয় না।
কিয়ে

1
এটি সঠিক উত্তর হওয়া উচিত।
আলবার্তস্কি

8

উপরোক্ত উত্তরগুলি ভাল যখন আপনি ডেভেল ইনস্টল এবং কনফিগার করেছেন।

দেভেল ছাড়াই ক্যোয়ারী মুদ্রণের সর্বোত্তম উপায় নীচে রয়েছে।

$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
//One way
echo $query->__toString();
// Second way
echo (string)$query;

আমরা কোয়েরিটি মুদ্রণের জন্য উপরের একটি উপায় ব্যবহার করতে পারি।


4

আমার একটি ভাল সমাধান রয়েছে যে আপনি পিপ্পায়াডমিনে "এসকিউএল" বিভাগে আপনার ক্যোয়ারী স্ট্রিংটি সরাসরি অনুলিপি / পেস্ট করতে পারেন এবং আপনার ক্যোয়ারী ডিবাগ করুন (আমি প্রায়শই এই পদ্ধতিটি ব্যবহার করি যখন আমি প্রশ্নের সাথে লড়াই করি)

$querystring=$query->__toString();
$querystring=str_replace("{",'',$querystring);
$querystring=str_replace("}",'',$querystring);
foreach($query->getArguments() as $key=> $item){

    if(!$item) {
        $item = 'NULL';
    }
    $querystring=str_replace($key.')',$item.')',$querystring);
}
dpm($querystring);

আমি আশা করি এটি অন্যান্য ছেলেদের জন্য উপকারী হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.