Код звонит выполнять()
на объекте, возвращенном из $запрос->andConditionGroup()
, но этот объект не реализует никаких выполнять()
метод.
Правильный способ использования и группа условий ()
показано в QueryBase::andConditionGroup()
.
$query = \Drupal::entityQuery('рисунок');
$group = $query->andConditionGroup()
->условие('цифры.цвет', 'красный')
->условие('figures.shape', 'треугольник');
$ запрос-> условие ($ группа);
$group = $query->andConditionGroup()
->условие('цифры.цвет', 'синий')
->условие('figures.shape', 'круг');
$ запрос-> условие ($ группа);
$entity_ids = $запрос->выполнить();
В вашем случае с помощью и группа условий ()
не требуется, поскольку запрос, выполняемый этим кодом, возвращает все узлы, для которых:
- Тип контента Уровень 3
- Название
$file_name
- Статус 0
Он не возвращает все узлы, для которых выполняется хотя бы одно из этих условий. Это похоже на то, что делает следующий код, который возвращает все страница узлы, где значение field_some_field выше 14.
$query = \Drupal::entityQuery('узел')
->условие('тип', 'страница')
->условие('field_some_field', 14, '>');
$результаты = $запрос->выполнить();
$запрос->выполнить()
возвращает массив идентификаторов сущностей, а не сущность и не массив сущностей. $nids = $запрос->выполнить(); $nids->setPublished(TRUE)->save();
по-прежнему неверно, так как массив не реализует setPublished ()
метод.
Учитывая массив идентификаторов узлов $ниды
, правильный код для загрузки узлов следующий.
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(array_values($nids));
$узлы
будет содержать массив сущностей. Опубликовать их можно с помощью следующего кода.
foreach ($nodes как $node) {
$node->setPublished(TRUE)->save();
}
Объект вернулся из \Drupal::entityQuery()
проверяет, что текущий пользователь, вошедший в систему, имеет доступ к просмотру возвращаемых узлов. В большинстве случаев у пользователя нет доступа к неопубликованным узлам. Чтобы запрос не возвращал только те узлы, которые может просматривать вошедший в данный момент пользователь, необходимо вызвать $запрос->проверка доступа(ЛОЖЬ)
, как в $query = \Drupal::entityQuery('узел')->checkAccess(FALSE);
Кроме того, существует ('нид')
call не требуется, так как идентификатор узла всегда сохраняется для узлов.
Оставляя петлю на $i_selected
, я бы использовал следующий код.
$query = \Drupal::entityQuery('узел')->checkAccess(FALSE);
$nids = $query->условие('тип', 'уровень3')
->условие('название', $file_name)
->условие('статус', '0')
->выполнить();
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(array_values($nids));
foreach ($nodes как $node) {
$node->setPublished(TRUE)->save();
}