Как получить данные с помощью Yii2 Query Builder

#php #mysql #yii2 #yii2-basic-app

#php #mysql #yii2 #yii2-basic-app

Вопрос:

Что я пытаюсь, у меня есть 2 таблицы staff и salarydetails, я хочу получить имя сотрудника и соответствующую зарплату

    $salaries = SalaryDetails::find()->select('salary_details.total_salary AS salary,staff.name AS name')
            ->leftJoin("staff",'salary_details.staff_id = staff.id');
        
            


                if ($fcreated_date != null amp;amp; $tcreated_date != null) {
                    $salaries->andFilterWhere(['>=','salary_details.salary_given_date', $fcreated_date]);   
                    $salaries->andFilterWhere(['<=', 'salary_details.salary_given_date', $tcreated_date]);
                }
 

когда я пытаюсь напечатать необработанный запрос sql с помощью

 echo $salaries->createCommand()->getRawsql();
 

я получил SELECT salary_details . total_salary КАК salary , staff . name КАК name salary_details СЛЕВА ПРИСОЕДИНИТЬСЯ staff К salary_details.staff_id = staff.id
и этот запрос дает данные, которые я хотел получить в phpMyAdmin

Но массив выдает ie, print_r($ salaries); дает

Объект yii db ActiveQuery ( [sql] => [on] => [joinWith] => [select] => Array ( [0] => salary_details.total_salary КАК зарплата [1] => staff.name КАК имя ) [selectOption] => [distinct] =>[from] => [groupBy] => [join] => Array ( [0] => Array ( [0] => ЛЕВОЕ СОЕДИНЕНИЕ [1] => staff [2] => salary_details.staff_id = staff.id ) ) [имеющий] => [объединение] => [параметры] => Array () [_events:yii base Component:private] => Array () [_behaviors:yii baseComponent:private] => Array () [где] => [limit] => [offset] => [OrderBy] => [indexBy] => [ModelClass] => common models SalaryDetails [with] => [asArray] => [multiple] => [primaryModel] => [link] => [via] => [inverseOf] => )

Спасибо,

Ответ №1:

Как вы можете видеть в вашем print_r , $salaries это ActiveQuery экземпляр. Вызовите методы ->asArray()->all() для него, чтобы получить записи.

 $query = SalaryDetails::find()
    ->select('salary_details.total_salary AS salary,staff.name AS name')
    ->leftJoin("staff",'salary_details.staff_id = staff.id');
if ($fcreated_date != null amp;amp; $tcreated_date != null) {
    $query->andFilterWhere(['>=','salary_details.salary_given_date', $fcreated_date]);   
    $query->andFilterWhere(['<=', 'salary_details.salary_given_date', $tcreated_date]);
}
$salaries = $query->asArray()->all();
 

Обратите внимание, что без asArray all этого будет возвращен массив SalaryDetails записей, и вы потеряете имя сотрудника.