Armani's avatar
Level 17

How to write a better query?

How to write this query better:

$employee = DB::table('employees')
        ->select('employees.id', 'employees.name')
        ->addSelect(['rank_id' => DB::table('reranks')->select('rank_id')
            ->whereColumn('reranks.employee_id', 'employees.id')
            ->orderByDesc('doc_date')
            ->limit(1)
        ])->addSelect(['doc_date' => DB::table('reranks')->select('doc_date')
            ->whereColumn('reranks.employee_id', 'employees.id')
            ->orderByDesc('doc_date')
            ->limit(1)
        ])->addSelect(['transport_id' => DB::table('transportations')->select('unit1_id')
            ->whereColumn('transportations.employee_id', 'employees.id')
            ->orderByDesc('doc_date')
            ->limit(1)
        ]);

$employees = DB::table('ranks')
        ->joinSub($employee, 'employee', function($join){
            $join->on('ranks.id', 'employee.rank_id');
        })
        ->join('unit1s', 'unit1s.id', 'employee.transport_id')
        ->select('employee.id', 'employee.name', 'ranks.name as rank', 'unit1s.name as unit', 'employee.rank_id','employee.doc_date', DB::raw('timestampdiff(YEAR,doc_date,CURDATE()) AS year, timestampdiff(MONTH,doc_date,CURDATE()) % 12 AS month'))
->whereRaw("(IF(rank_id = 14 AND timestampdiff(YEAR,doc_date,CURDATE()) >= 1, 1, 0) OR IF(rank_id = 13 AND timestampdiff(YEAR,doc_date,CURDATE()) >= 2, 1, 0) OR IF(rank_id >= 3 AND rank_id <= 12 AND timestampdiff(YEAR,doc_date,CURDATE()) >= 3, 1, 0)) AND (doc_date BETWEEN '$request->from' AND '$request->to')")
        ->
orderBy('name')
->get();
0 likes
1 reply
bugsysha's avatar

I would first start with the formatting of the code. When you have -> put it on a new line followed by the code. Try that and see how it looks.

Compare this one with yours:

$employee = DB::table('employees')
    ->select('employees.id', 'employees.name')
    ->addSelect([
        'rank_id' => DB::table('reranks')
            ->select('rank_id')
            ->whereColumn('reranks.employee_id', 'employees.id')
            ->orderByDesc('doc_date')
            ->limit(1),
    ])
    ->addSelect([
        'doc_date' => DB::table('reranks')
            ->select('doc_date')
            ->whereColumn('reranks.employee_id', 'employees.id')
            ->orderByDesc('doc_date')
            ->limit(1),
    ])
    ->addSelect([
        'transport_id' => DB::table('transportations')
            ->select('unit1_id')
            ->whereColumn('transportations.employee_id', 'employees.id')
            ->orderByDesc('doc_date')
            ->limit(1),
    ]);

Which one is cleaner and easier to follow?

1 like

Please or to participate in this conversation.