it-swarm.asia

"أين لا تكون (حدد ...)" مع SelectQuery؟

هل من الممكن إضافة جملة WHERE NOT IN (SELECT...) إلى كائن SelectQuery؟ كنت أنظر إلى SelectQuery :: condition () ، ولا يبدو أنها تسمح بهذه البنية:

public SelectQuery::condition($field, $value = NULL, $operator = NULL)

يبدو فقط أنه يسمح بتعابير مقارنة القيمة. هل هناك طريقة أخرى توفر هذه البنية؟

أنا أنظر إلى الشروط المتعلقة بترتيب آلاف القيم ، لذا يبدو من غير الفعال أن يكون لديك مجموعة من AND value <> x الظروف.

6
user1359

ما تبحث عنه هو SelectQuery :: موجود () ، للأسف لا يبدو أنه يعمل مع "طريقة شائعة" لبناء مثل هذه الفقرة:
عادة في _EXISTS عبارة تضع JOIN على جداول خارج الاستعلام الفرعي الخاص بك مثل هذا:

SELECT n.nid
FROM node n
WHERE EXISTS (
  SELECT NULL
  FROM users u
  WHERE u.uid = n.uid
  AND u.status = 0)

هذا يعيد عقد المستخدمين المحظورين (نعم يمكن بناؤه بسهولة بدون EXISTS ولكنه لأغراض التدريس ؛).

تكمن المشكلة هنا في أن شرط exists لا يدعم "الربط الخارجي" ، الجزء u.uid = n.uid ، لذا عليك إنشاء استعلام مستقل تمامًا ليس فعالًا للغاية IMHO.
في Drupal ستكتب التالي:

$query = db_select('node', 'n')
  ->fields('n', array('nid'));
$subquery = db_select('node', 'n2')
  ->fields('n2', array('nid'))
  ->join('users', 'u', 'n2.uid = u.uid'
  ->condition('u.status', 0);
$query->condition('', $subquery, 'EXISTS');
$result = $query->execute();

يمكنك أيضًا استخدام db_query () مثلما كنت تفعل في Drupal 6 وبالطبع SelectQuery :: notExists () متاح.

8
tostinni

أسهل طريقة لاستخدام db_select مع تحديد IN IN الفرعي هي الاستخدام فقط

$ الاستعلام-> أين

لإضافة تعسفي حيث الشرط.

على سبيل المثال:

  // Count query for users without rid 3
  $query = db_select('users', 'u');
  $query->fields('u', array('uid'));
  $query->where('u.uid NOT IN(select uid from {users_roles} where rid = :rid)', array(':rid' => 3));  
  $result = $query->countQuery()->execute()->fetchField();
  drupal_set_message($result);
2
David Thomas

حقًا ، يمكنك يمكنك استخدام SelectQuery :: condition () لإنشاء اختيارات فرعية مثل:

$query = db_select('users', 'u')
  ->fields('u', array('uid'))
  ->condition('u.uid', db_select('users_roles', 'r')->fields('r', array('uid')), 'NOT IN');

إذا قمنا بطباعة هذا الاستعلام باستخدام وظيفة dpq () من devel ، فسيتم إخراج:

SELECT u.uid AS uid
FROM 
{users} u
WHERE  (u.uid NOT IN  (SELECT r.uid AS uid
FROM 
{users_roles} r))

آمل أن يساعد هذا ؛-)

2
Jelle

أعتقد أن هذا سيساعدك.

$query->where('n.nid NOT IN (:nids)', array(
    ':nids' => implode(',', $nids)
));
0
Vlad Stratulat