Я пытаюсь извлечь теги из базовой базы данных craft и использовать ее в качестве конечной точки REST - однако меня интересует только представление идентификатора и заголовка тега, поэтому мои данные должны выглядеть следующим образом:
{id: 1, title: "hello"}, {id: 2, title: "test"}
В настоящее время я могу добиться этого с помощью следующего запроса:
$tags = \craft\elements\Tag::find()->all();
Проблема в том, что он возвращает все поля, которые имеет тег. Затем мне нужно отфильтровать два поля, которые я хочу, выполнив:
foreach($tags as $tag) {
$out = [];
$out['id'] = $tag['id'];
$out['title'] = $tag['title'];
return $out;
}
Это довольно расточительно, так как я выбираю кучу полей, которые мне не нужны, из БД, а затем перебираю всетеги и разбор двух нужных мне полей.
Вместо этого я хотел бы только получить эти два поля из craft в моем запросе.
Я нашел два возможных способа сделать это - один из них использует метод select
:
Что-то вроде
$tags = \craft\elements\Tag::find()->select(['id', 'title']).all();
Проблема с приведенным выше кодом заключается в том, чтоSQL-запрос, который выполняется выше, на самом деле не имеет полей с именами id
и title
из-за псевдонимов и объединений, выполняемых в нескольких таблицах - поэтому я должен был бы точно знать, какие поля я хочу и в какихтаблицы в схеме SQL они сидят ... это не хорошо масштабируется для более сложных запросов.
Я также нашел https://www.yiiframework.com/doc/api/2.0/yii-base-arrayable#fields()-detail, который, кажется, мог бы быть полезным, но я не смог заставить это работать вообще, и документация не слишком полезна.