yii2, связь моделей. Убрать лишние запросы, типизация данных при queryAll()
/**
* Gets query for [[Generation]].
*
* @return \yii\db\ActiveQuery
*/
public function getGeneration()
{
return $this->hasMany(Generations::className(), ['id' => 'generationId']);
}
/**
* Gets query for [[Make]].
*
* @return \yii\db\ActiveQuery
*/
public function getMake()
{
return $this->hasOne(Makes::className(), ['id' => 'makeId']);
}
/**
* Gets query for [[Model]].
*
* @return \yii\db\ActiveQuery
*/
public function getModel()
{
return $this->hasOne(Models::className(), ['id' => 'modelId']);
}
/**
* Gets query for [[User]].
*
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'userId']);
}
/**
* Gets query for [[Year0]].
*
* @return \yii\db\ActiveQuery
*/
public function getYears()
{
return $this->hasMany(Years::className(), ['id' => 'yearId']);
}
/**
* Створює query, для отримання ПОВНОЇ інформації юзера авто
*
* @return \yii\db\ActiveQuery
*/
public function getQueryAllInfoUserCars()
{
$query = $this::find()
->select([
'user_cars.id as userCarId',
'user_cars.makeId',
'user_cars.modelId',
'user_cars.generationId',
'user_cars.yearId',
'user_cars.buyYear',
'user_cars.color',
'user_cars.about',
'user_cars.hold',
'user_cars.engine',
'user_cars.volume',
'user_cars.transmission',
'user_cars.drive',
'user_cars.horsepower',
'user_cars.vin',
'user_cars.plate',
'user_cars.carUsername',
'user_cars.scrapped',
'user_cars.displacement',
'makes.id as makeId',
'makes.name as makeName',
'models.id as modelId',
'models.name as modelName',
'models.defaultName as modelDefaultName',
'generations.id as generationId',
'generations.defaultName as generationDefaultName',
'generations.name as generationName',
'years.id as yearId',
'years.name as yearName',
])
->joinWith('make')
->joinWith('model')
->joinWith('generation')
->joinWith('years');
return $query;
}
/**
* Повертаю ПОВНУ інформацію по автомобілю юзера, якшо юзер - авторизований
*
* @return array
* @throws \yii\db\Exception
*/
public function getLoggedUserCars()
{
$query = $this->getQueryAllInfoUserCars();
$query->where(['user_cars.userId' => Yii::$app->user->identity->id]);
$result = $query->all();
//TODO do logic
return $result
}
Я делаю связный запрос к БД, чтобы получить данные. Но в логе я заметил что yii2 автоматически делает лишние запросы которые мне не нужны (joinWith делает мне leftJoin и в select я беру данные которые мне нужны)
/models/UserCars.php:255 2022-12-06 11:34:08 [::1][][-][profile end][yii\db\Command::query] SELECT * FROM makes WHERE id IN (13, 137)
UserCars.php:255 2022-12-06 11:34:08 [::1][][-][profile end][yii\db\Command::query] SELECT * FROM models WHERE id IN (561, 206)
Аналогично для generation, years.
Но эти данные я уже получаю в моем запросе getLoggedUserCars. Как мне убрать эти лишние 4 запроса?
Если я сделаю $result->queryCommand->queryAll() это вернет мне данные, но типизация данные пропадет (а она мне нужна).
Мне нужно чтобы данные которые я получал добавились в модель и была типизация данных. queryAll убирает всю типизацию данных и это большая проблема для меня.
Ответы (1 шт):
Чтобы решить проблему как у меня я нашел данный пакет https://github.com/yii2tech/ar-eagerjoin. Это делает то что нужно.