在Laravel中用()内部命令

时间:2018-06-05 09:59:15

标签: php laravel eloquent

我有一个控制器根据get查询中收到的变量过滤其表中的列,然后根据获得的变量的id返回另一个表的值,但是现在我希望通过users表中的$filter_by_name列过滤first_name条件,请问我该怎么做,即我想返回按first_name列排序的users表

DB-STRUCTURE

公司用户表

id  company_id  user_id role created modified active department_level

USERS TABLE

id 
first_name 
last_name 
email 
password 
active_company 
profile_photo_id 
verified 
active 
remember_token 
created 
modified

公司 - 用户控制器

public function getCompanyUsers($companyId)
{
    $filter = strtolower(Input::get('filter'));
    if($filter && $filter === 'on' ){
        $filter_by_date = strtolower(Input::get('filter_by_date'));
        $filter_by_name = strtolower(Input::get('filter_by_name'));
        $filter_by_role = strtolower(Input::get('filter_by_role'));
        if($filter_by_date){
            if($filter_by_date == 'oldest'){
                $users = CompanyUser::where('company_id', $companyId)->orderBy('created', 'DESC')
                ->with(['user','user.userDepartments','user.userDepartments.department'])->get();
                return $users;
            }else{
                $users = CompanyUser::where('company_id', $companyId)->orderBy('created', 'ASC')
                    ->with(['user','user.userDepartments','user.userDepartments.department'])->get();
                return $users;
            }
        }elseif ($filter_by_name){
            if($filter_by_name == 'ascending'){
                $users = CompanyUser::where('company_id', $companyId)->orderBy('first_name', 'ASC')
                    ->with(['user','user.userDepartments','user.userDepartments.department'])->get();
                return $users;
            }else{
                $users = CompanyUser::where('company_id', $companyId)->orderBy('first_name', 'DESC')
                    ->with(['user','user.userDepartments','user.userDepartments.department'])->get();
                return $users;
            }
        }elseif($filter_by_role){
            if($filter_by_role == 'member'){

                $users = CompanyUser::where(['company_id' => $companyId,'role'=>'Member'])->with(['user','user.userDepartments','user.userDepartments.department'])->get();
              //  dd($users);
                return $users;
            }elseif($filter_by_role == 'manager'){
                $users = CompanyUser::where(['company_id' => $companyId,'role'=>'Manager'])->with(['user','user.userDepartments','user.userDepartments.department'])->get();
                return $users;
            }else
                $users = CompanyUser::where(['company_id' => $companyId,'role'=>'Admin'])->with(['user','user.userDepartments','user.userDepartments.department'])->get();
            return $users;
        }
    }
    $users = CompanyUser::where('company_id', $companyId)->
    with(['user','user.userDepartments','user.userDepartments.department'])->get();
    //dd($users);
    return $users;
}

3 个答案:

答案 0 :(得分:2)

您必须在以下关系模型上执行orderBy:

 $users = CompanyUser::where('company_id', $companyId)
->with(['user' => function($subQuery){
     $subQuery->orderBy('first_name', 'ASC');
}])
->with(['user.userDepartments','user.userDepartments.department'])
->get();

return $users;

答案 1 :(得分:2)

你可以在急切加载时传递更接近的函数来添加类似的约束,详见laravel docs

$users = CompanyUser::with(['user'=> function ($query) {
                                   $query->orderBy('first_name', 'desc');
                                 }
                           ])
                      ->where('company_id', $companyId)
                      ->get();

答案 2 :(得分:0)

一种方法是添加列' first_name'在公司用户'表

现在您可以通过(' first_name',' ASC')进行排序。 我认为这不是最好的方式,但我脑子里还没有其他想法。