php 有些表有多行,在这种情况下,我想添加自动递增后缀数字结束字段名称,并使所有数据在一个数组

7fyelxc5  于 2023-03-16  发布在  PHP
关注(0)|答案(1)|浏览(73)

我有更多的10个SQL表有员工的详细信息。一些表有单行的详细信息,如基本的详细信息表,这是主表。第二个联系人表我用id=emp_id和leftjoin索引这个表,以获得在单一数组中的所有数据。而且我也有一些更多的表,如eduction,它有多行匹配emp_id,我想在单一数组中的所有表数据。员工教育程度字段名称为education_level,它有2行,我需要类似education_level_1=〉值、education_level_2=〉值等结果...

$employeeData = EmployeeBasicDetail::select(
            '*','employees_basic_details.id as emp_id',
            'employees_basic_details.client_id',)
        ->where('employees_basic_details.id',$emp_id)
        ->leftJoin('employees_company_details', 'employees_company_details.employee_id', '=', 'employees_basic_details.id')
        ->leftJoin('employees_contact_details', 'employees_contact_details.employee_id', '=', 
        ->first();

 $employeeEducations = EmployeeEducationDetail::where('employee_id',$emp_id)->get();
        $employeeEmploymentDates = EmployeeEmploymentDateDetail::where('employee_id',$emp_id)->get();

这段代码是可以的,只要我在刀片中发送它们,这样我就可以使foreach和显示重复的数据在循环中,并显示所有其他在employeeData ex:

return view('hrm.employees.create',compact('auth_user','auth_role','superadmin','employeeData','employeeEducations','employeeEmploymentDates'));

但是我想让excel下载,所以我把代码修改成

$data = EmployeeBasicDetail::select('employees_basic_details.employee_first_name', DB::raw('GROUP_CONCAT(employees_education_details.education_level SEPARATOR ",") as education_levels'))
            ->leftJoin('employees_education_details', 'employees_basic_details.id', '=', 'employees_education_details.employee_id')
            ->where('employees_basic_details.id', 1)
            ->groupBy('employees_basic_details.id', 'employees_basic_details.employee_first_name')
            ->first();
            //dd($data);
        if ($data !== null) {
            $employeeData = array(
                'employee_first_name' => $data->employee_first_name,
            );
            $education_levels = explode(',', $data->education_levels);
            foreach ($education_levels as $key => $level) {
                $employeeData['education_level_' . ($key + 1)] = $level;
            }
        } else {
            $employeeData = array();
        }

它的工作,我可以得到所有的数据在一个数组中,我这个代码,我需要提到所有的字段在选择和组,并再次在foreach我正在处理15表和120字段总数。是他们的任何更短的方式来实现这一点。请让我知道,如果任何更多的细节需要。我真的很喜欢她的任何想法,使它更聪明的方式来处理这个朋友,我希望它会感兴趣,你给予我答案。谢谢。

tp5buhyn

tp5buhyn1#

定义基本员工详细信息的模型

class EmployeeBasicDetail extends Model {
    public function companyDetails() {
        return $this->hasOne(EmployeeCompanyDetail::class, 'employee_id');
    }
    public function contactDetails() {
        return $this->hasOne(EmployeeContactDetail::class, 'employee_id');
    }
    public function educationDetails() {
        return $this->hasMany(EmployeeEducationDetail::class, 'employee_id');
    }
    public function employmentDates() {
        return $this->hasMany(EmployeeEmploymentDateDetail::class, 'employee_id');
    }
}

在控制器方法中,获取基本的雇员详细信息并立即加载相关的表

$employeeData = EmployeeBasicDetail::with(['companyDetails', 'contactDetails', 'educationDetails', 'employmentDates'])
                    ->where('id', $emp_id)->first();

现在,您可以使用点表示法访问相关数据

echo $employeeData->companyDetails->company_name;
echo $employeeData->contactDetails->email;

要获取单个数组中的教育数据,可以使用map()方法

$educationData = $employeeData->educationDetails->mapWithKeys(function ($item, $key) {
    return ['education_level_' . ($key + 1) => $item->education_level];
});

将所有数据合并到单个数组中

$employeeArray = array_merge($employeeData->toArray(), $educationData->toArray(), ...);

最后,返回数组或生成excel下载

return view('hrm.employees.create', compact('employeeArray'));

相关问题