Есть модели Job и JobCategory. К одной Job может быть привязано множество JobCategory. Их связь реализуется через таблицу-связку, а метод в классе Job выглядит так:
public function getCategories() {
return $this->hasMany(JobCategory::className(), ['id' => 'category_id'])
->viaTable(JobToCategoryLink::tableName(), ['job_id' => 'id']);
}
Таким образом я могу делать жадную загрузку всех связанных с Job'ом категорий:
Job::find()
->joinWith(['categories'])
Однако, это влечёт расход памяти, потому что для каждого Job создаётся массив JobCategory, каждый элемент JobCategory является уникальным объектом, хотя многие из элементов и представляют одну и ту же запись в БД.
Так как записей JobCategory у меня не много, я кеширую их в память в redis, написал репозиторий JobCategoryRepository, который имеет метод fetchAll($idList) и по списку идентификаторов возвращает инстансы JobCategory.
Вопрос: как сделать жадную загрузку ТОЛЬКО МАССИВА ИДЕНТИФИКАТОРОВ КАТЕГОРИЙ, связанных с Job? По-идее я мог бы составить запрос вида:
public function getCategoryIdList() {
return $this->hasMany(JobToCategoryLink::tableName(), ['job_id' => 'id'])
->addSelect(['category_id']);
}
и загружать его через ->joinWith(['categoryIdList']), но в этом случае рилейшен categoryIdList всегда пустой массив. Вернуть просто Query с нужными параметрами запроса я не могу, потому что запросы из рилейшенов выполняются либо через ->one либо ->all в случае если у объекта запроса стоит multiple = true. А мне нужно просто ->column.
Есть идеи?