Db_select () এ "OR" শর্ত


51

আমি নতুন ডাটাবেস স্তরটি অধ্যয়ন করছি এবং আমি আনন্দিত যে এটি একটি ওওপি স্তরে পরিবর্তিত হয়েছে। আমার সাথে একটি কোয়েরি প্রয়োগ করা দরকার db_select()। আমি দেখতে পেয়েছি যে আমি এর WHEREসাথে একটি বিবৃতি যোগ করতে পারি $query->condition(), তবে ডিফল্টরূপে শর্তগুলি একসাথে করা হয়।

কীভাবে আমি বা শর্তগুলি একসাথে করতে পারি?

$query=db_select('users','u')->fields('u',array('uid','title','created','uid'));
$query->join('flag_content','fc' , 'u.uid = fc.content_id');
$query->condition('fc.fid', '5' , '=');
$query->condition('fc.uid', $uid , '=');
//…

উত্তর:


81

এটি সঠিক নয়, ডিফল্টটি হল AND AND ব্যবহার করতে বা, আপনাকে ব্যবহার করতে হবে:

$or = db_or();
$or->condition();
$or->condition();
$query->condition($or);

তবে ক্যোয়ারির মূল শর্তগুলি অবশ্যই স্পষ্টভাবে এবং এর সাথে যোগদান করেছে।


30

আপনি এটি তৈরি করতে 2 টি শর্তের মধ্যে বাই ডিফল্ট এবং এটি তৈরি করতে পারেন

$query=db_select('users','u')->fields('u',array('uid','title','created','uid'));
$query->join('flag_content','fc' , 'u.uid = fc.content_id');

$db_or = db_or();
$db_or->condition('fc.fid', '5' , '=');
$db_or->condition('fc.uid', $uid , '=');
$query->condition($db_or);

$result = $query->execute()->fetchAll();

বা এর মধ্যে ও শর্ত থাকা সম্ভব বলে মনে করুন আপনার কাছে 3 টি শর্ত রয়েছে এবং আপনি যদি এটি কন 1 এবং কন 2 বা কন 3 এর মতো হতে চান এবং এই ক্ষেত্রে অন্যান্য অনেকগুলি ঘটনা পূরিত করতে চান তবে আপনি ডিবি_আর এর মতো ডিবি_ওর ব্যবহার করতে পারেন কারণ আপনি যখন সমস্ত ডিবি_আর ব্যবহার করার চেষ্টা করছেন db_or এর মধ্যে অবস্থাগুলি এখন আপনি নিতে চান এবং আপনার মধ্যে ডিবি_আর ব্যবহার করতে পারেন এটি কিছুটা ক্লান্তিকর তবে এর বাস্তবায়নের সম্ভাবনা নীচের উদাহরণটির চেয়ে বেশি

 $query = db_select('work_details_table','wd');
$query->join('work_table','w','wd.request_id = w.request_id');
$query->fields('w',array('client_id'));
$query->fields('wd');
$query->condition('wd.request_id',$request_id);
if($status == 5 || $status == 6 || $status == 7){
  $query->condition('wd.status',$status);
}elseif($user_type == 'writer'){
  $query->condition('wd.writer_id',$user_id);  
  $db_or = db_or();
  $db_and = db_and();
    $db_and->condition('wd.status',2);
    $db_and->isNull('wd.editor_id');
  $db_or->condition('wd.status',4);
  $db_or->condition('wd.status',1);
  $db_or->condition($db_and);
  $query->condition($db_or);
}else if($user_type == 'editor'){
  $query->condition('wd.editor_id',$user_id);
  $db_or = db_or();
  $db_and = db_and();
    $db_and->condition('wd.status',2);
    $db_and->isNotNull('wd.editor_id');
  $db_or->condition('wd.status',3);
  $db_or->condition($db_and);
  $query->condition($db_or); 
}
//-----------------------------------------------------------------------------------------
$completed_sku = $query->execute()->fetchAll();

এটি আপনাকে একটি ধারণা দেবে যে কীভাবে জটিল এবং বা পরিস্থিতি দ্রুপাল পিডিও ক্যোয়ারিতে পরিচালনা করা যায়।


22

ড্রুপাল 7 ডাটাবেস ডকুমেন্টেশন অনুসারে ডিফল্ট হল শর্ত এবং শর্ত, তবে আপনি যদি ওআর শর্তটি ব্যবহার করতে চান তবে এটি ব্যবহার করুন;

$db_or = db_or();
$db_or->condition('n.type', 'event', '=');
$db_or->condition('n.type', 'article', '=');
$query->condition($db_or);

10

সাধারণ উদাহরণ:

$nodes = db_select('node', 'n')
->fields('n')
->condition(
 db_or()
   ->condition('uid', 1)
   ->condition('status', 0)
 )
->execute()
->fetchAll();

1

ডিফল্টরূপে শর্ত থাকে এবং ওআর শর্তের জন্য শর্তের ভিতরে db_or () যুক্ত করা দরকার।

$query = db_select('soccer_team"', 'n');
$query->fields('n',array('stid','title'))//SELECT the fields from node
        ->fields('n',array('title'))//SELECT the fields from user
            ->condition(
             db_or()
            ->condition('title','%ace%','LIKE')
            ->condition('title','%alb%','LIKE')
            )
        ->orderBy('title', 'ASC');

0

আপনি যখন একটি জটিল কোয়েরি তৈরি করছেন যেখানে আপনি বেশিরভাগ শর্তগুলি AND এর এবং শুধুমাত্র একটি বা কিছু বা শর্ত (শর্ত) এর সাথে মিলিত করতে চান যেখানে db_or () সমাধান কাজ করবে না।

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

$query = db_select('users');
$query->join('user_join', NULL, 'users.uid = userid');
$query->join('field_data_account', NULL, 'appid = entity_id');
$query->leftJoin('users_roles', 'roles', 'users.uid = roles.uid');
$query->condition('account_target_id', $form['#account_id']);
$query->condition('userid', $lab_user->uid);
$query->where('appid <> :app_id OR rid = :rid', array(
    ':app_id' => $form['#app_id'],
    ':rid' => $role->rid,
))->fields('users')->countQuery();
$result = $query->execute()->fetchField();

এই উত্তরটি সঠিক নয়: db_or()এমনকি যখন দুটি দুটি শর্ত রয়েছে যা AND'ed হওয়া 5 টি শর্তের মধ্যে OR'ed করা দরকার তখনও কাজ করে। এ $query->where()জাতীয় ক্ষেত্রে ব্যবহার করার দরকার নেই ।
কিমলালুনো

স্পষ্টতার জন্য ধন্যবাদ, তখনকার ক্ষেত্রে এটি কীভাবে ব্যবহৃত হবে? db_select () -> শর্ত () -> শর্ত () -> db_or () -> শর্ত () ??
tcm5025

1
আপনার অনুরূপ কিছু ব্যবহার করতে হবে db_select()->condition($a)->condition($b)->condition(db_or()->condition($c)->condition($d))->condition($e); ফলাফল শর্ত হবে $a AND $b AND ($c OR $d) AND $e। আমি সিউডো-কোড ব্যবহার করছি। db_or()একটি ফাংশন, একটি পদ্ধতি নয়; db_select()->condition()->db_or()সংজ্ঞায়িত না হওয়া পদ্ধতি সম্পর্কে একটি ত্রুটি ফেরত দেবে।
kiamlaluno

ঠিক আছে, আমি এটি পেয়েছি ব্যাখ্যার জন্য আবার ধন্যবাদ। আমি এই ধারণা ছিল যে এটি একটি পদ্ধতি ছিল। সুতরাং এটি আমার সমস্যার জন্য কাজ করবে।
tcm5025

0

ড্রুপাল 8 এর জন্য আপনি যেমন ব্যবহার করতে পারেন:

// Use only records with ACCEPTED or REJECTED action.
$orCondition = $query->orConditionGroup();
$orCondition->condition('action', 'ACCEPTED');
$orCondition->condition('action', 'REJECTED');
$query->condition($orCondition);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.