Как повторно использовать условия запроса?


У меня есть полу-новый сайт Drupal 7, на котором администраторы утверждают учетные записи менеджеров, а менеджеры утверждают учетные записи своих сотрудников. Все это отлично работает. Меня попросили сделать так, чтобы менеджеры могли удалять учетные записи сотрудников, которые больше не нужны.

Используя нашу старую CMS, когда весь наш SQL был написан от руки, я мог бы создать оператор "где", например:

$cWhere = "WHERE e.department = 'HR' and e.manager = 12345"

Эти элементы вводятся не пользователем, а на основе зарегистрированного пользователя. Чтобы показать список сотрудников, которых я мог бы запустить:

"SELECT * FROM users " . $cWhere

Затем, чтобы удалить, я мог бы запустить:

"DELETE FROM users " . $cWhere . " AND uid = " . $deleteUser

Это гарантировало бы, что человек, вошедший в систему и пытающийся удалить пользователя, имел на это разрешение, поскольку были проверены дополнительные условия менеджера и отдела. Кроме того, если условия для списка сотрудников изменены, код удаления автоматически обновляется, чтобы учесть новые условия без дополнительной работы. Для записи, запрос является значительно сложнее, чем это, но нет причин усложнять вопрос больше, чем это необходимо.

Теперь я все делаю с помощью db_select. Поэтому я строю запрос, чтобы показать список пользователей. Мне нужен дополнительный запрос, чтобы проверить, что у вошедшего в систему пользователя есть разрешение на удаление целевого пользователя. Затем я бы вызвал функцию user_delete(). Есть ли какой-нибудь способ сделать это, или мне нужно полностью перестроить запрос во второй раз?

Нерабочий код, но что-то вроде этого :

if (isset($deleteUser))
{
   $chkUser = $query; //$query is an existing db_select that hasn't been ran yet
   $chkUser->condition('u.uid', $deleteUser, '=');
   $rowsUser = $chkUser->execute();
   if ($rowsUser->rowCount() == 1)
   {
       user_delete($deleteUser); //user has permission
   }
}

$result = $query->extend('PagerDefault')->limit(20)->execute();

//... loop results, output list ...

Обратите внимание, я пробовал вышеописанное с помощью комментария user_delete()... но $CHKUSER, очевидно, является указателем на $query, так как напечатанный список в конечном итоге оказывается только тем пользователем, о котором идет речь. Так что все работает так, как мне нужно, за исключением того, что я исказил свой запрос на список пользователей, делая это таким образом.

 1
Author: DragonYen, 2014-02-13

1 answers

Вы можете использовать функцию db_and() и db_or() для компиляции наборов условий, которые вы можете добавить в существующий запрос следующим образом:

$query = db_select('Exhibitors', 'e');
$db_and = db_and();
$db_and->condition('ProductCategory', array(1,2,3), 'IN');
$db_and->condition('status', 'active');
$query->condition($db_and);

Пример, приведенный здесь: https://api.drupal.org/api/drupal/includes!база данных!база данных.inc/функция/db_and/7

Кроме этого, существует класс databasecondition, который также может быть интересен для вас.

 1
Author: berliner, 2014-02-13 17:34:04