首页 > 解决方案 > 如何使用 Yii2 Query Builder 获取数据

问题描述

我正在尝试什么我有 2 个表员工和薪水详细信息,我想获取员工姓名和相应的薪水

   $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 && $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_detailstotal_salary作为salarystaffnameAS nameFROM salary_detailsLEFT JOIN staffON Salary_details.staff_id = staff.id 这个查询给出了我在 phpMyadmin 中想要的数据

但是数组给出了即 print_r($salaries); 给

yii\db\ActiveQuery 对象 ( [sql] => [on] => [joinWith] => [select] => 数组 ([0] => Salary_details.total_salary AS 薪水 [1] => staff.name AS name ) [selectOption] => [distinct] => [from] => [groupBy] => [join] => Array ( [0] => Array ( [0] => LEFT JOIN [1] => staff [2] => Salary_details.staff_id = staff.id ) ) [having] => [union] => [params] => Array ( ) [_events:yii\base\Component:private] => Array ( ) [_behaviors:yii\ base\Component:private] => Array () [where] => [limit] => [offset] => [orderBy] => [indexBy] => [modelClass] => common\models\SalaryDetails [with] = > [asArray] => [multiple] => [primaryModel] => [link] => [via] => [inverseOf] => )

谢谢,

标签: phpmysqlyii2yii2-basic-app

解决方案


正如您在 , 中看到的那样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 && $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();

请注意,如果没有asArrayall返回记录数组,SalaryDetails您将丢失员工姓名。


推荐阅读