Рейтинг:1

Можно ли использовать подзапрос в запросе сущности?

флаг ai

Как я могу добавить условие к запросу сущности Drupal 9, используя другой запрос сущности для другого типа сущности?

Я проиллюстрирую вопрос, описав один конкретный вариант использования, хотя не думаю, что будет сложно придумать сколько-нибудь правдоподобных вариантов использования.

Приложение для этого варианта использования отслеживает статьи в опубликованной медицинской литературе. Статья представлена ​​пользовательским типом объекта, который отслеживает, когда она была импортирована в систему, был ли получен полный текст статьи, какие темы были присвоены статье, для каких циклов рецензирования, когда и в каком журнале она была опубликовано и много другой информации.

Второй тип настраиваемого объекта предназначен для представления пакетов («пакетов») статей, предназначенных для проверки, с отслеживанием того, когда были назначены пакеты, для каких тем и каким специалистам-онкологам, а также каковы были результаты этих обзоров. Статья может быть назначена многим пакетам обзора, каждому из которых назначено несколько рецензентов, и каждый пакет обзора может запрашивать обзоры для любого количества статей.

Модуль поиска для этого приложения требует, чтобы статьи можно было искать на основе множества различных критериев, большинство из которых можно применить, проверив Статья сущности, но некоторые из них могут быть реализованы только путем просмотра значений в Пакет сущности. Пример поиска может, например, потребовать найти все статьи, опубликованные за последние двенадцать месяцев в журнале J и назначенные для рецензирования рецензентом R.

В CMS, более подходящей для работы непосредственно с реляционными таблицами SQL, было бы очень просто поддерживать такой поиск, используя пару объединений таблиц. Но Drupal делает этот подход менее привлекательным, так как у нас нет документированной гарантии того, что соглашения об именовании таблиц и столбцов под сущностями не изменятся.

Я мог бы создать и выполнить два отдельных запроса сущностей и использовать результаты второго, чтобы отсеять результаты, возвращаемые первым запросом, которых нет в результатах второго. Но среди недостатков этого подхода тот факт, что он ломает механизм подкачки Drupal.

Я мог бы попытаться имитировать то, что СУБД будет делать гораздо эффективнее, передав идентификаторы сущностей, возвращенные вторым запросом, в условие первого запроса, но кто знает, какие внутренние ограничения могут возникнуть, когда результаты второго запроса огромный?

Я мог бы реализовать кладж для денормализации данных, сохраняя ссылки на сущности из Статья сущности обратно в Пакет сущности, которые, в свою очередь, указывают на Статья сущности, но все мы знаем о проблемах с попыткой синхронизировать одну и ту же информацию в нескольких местах.

Если все поиски были для статей, предназначенных для обзора, я мог изменить ситуацию и использовать запрос сущности на Пакет тип, после его ссылки на Статья объекты для других критериев, которые необходимо проверить. Но большой процент поисков предназначен для поиска статей независимо от того, были ли они назначены для рецензирования или нет. Таким образом, для этого пути мне пришлось бы реализовать два отдельных набора логики поиска параллельно: один для поиска, который включает в себя назначение для просмотра пакетов, а второй — для поиска, который не заботится о назначении для просмотра. И этот подход по-прежнему не подходит для поиска статей, которые имеют нет был назначен на рассмотрение. И имейте в виду, что я делаю этот пример использования простым, ограничивая его только двумя типами сущностей.

Поиск в Google (и поиск по этому форуму) продолжает отвлекать меня к информации об использовании базовых API-интерфейсов запросов к базе данных вместо системы запросов сущностей, по крайней мере, с терминами запросов, которые я использую.

Есть ли способ использовать подзапрос (или, что еще лучше, присоединиться к другому типу сущности) в API запросов сущностей? Если нет, то есть ли перспективы поддержки такой обсуждаемой функциональности в Drupal Valhalla?

флаг cn
Для сложных поисков, включающих несколько типов объектов, [Search API](https://www.drupal.org/project/search_api) и [Search API Solr](https://www.drupal.org/project/search_api_solr) являются отличное решение, которое дает вам полный контроль над созданием индекса, как вам нравится. Конечно, огромным недостатком этого является то, что вам также нужно настроить Solr.
флаг ai
Спасибо, @Патрик. Я взгляну.
флаг in
API поиска — хорошее предложение. Таким образом, вы будете работать с представлением, а не с запросом объекта. Вы можете дополнительно расширить свой проект, используя пакеты сущностей и поля Entity Reference.Я не видел, чтобы вы упомянули, сделали ли вы это, но может быть полезно начать с определения всех ваших сущностей как пакетов одного типа сущностей. Затем ваше представление сможет детализировать все типы пакетов одновременно. Поля Entity Reference позволяют создавать явные отношения между объектами; используйте кардинальность поля, чтобы установить связь один-к-одному или один-ко-многим.

Ответить или комментировать

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