@tekord
Веб-разработчик

Как сделать жадную загрузку ТОЛЬКО массива идентификаторов из таблицы связки?

Есть модели 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.

Есть идеи?
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы