如何通过ID将表联接为查询-laravel中的主键

问题描述 投票:3回答:3

我想做一个基于2个数据库表进行过滤的功能。但是,我不确定如何将联接表放入查询中。这意味着在将结果返回到数据表之前,将从两个表(用户表和雇员表)中过滤掉数据。

我的过滤器查询是

public function filterQuery(Request $request){

    $age = $request->age;
    $gender= $request->gender;

    $query = user::query();

    if(!empty($request->age)){
        $query->where('age','>=',$age );
    }

    if(!empty($request->gender)){
        $query->where('gender','<=',$gender);
    }

    $data = $query->get();

    return datatables()->of($data)->make(true);
}

我要加入查询的表来自表employee(列=收入和house_ownership)。连接两个表的主键是IC。

laravel inner-join jointable
3个回答
0
投票

尝试一下

public function filterQuery(Request $request){

    $age = $request->age;
    $gender= $request->gender;
    if(!empty($request->age)){
       $data = User::where('age','>=',$age)->get();
    }

    if(!empty($request->gender)){
      $data =  User::where('gender','<=',$gender)->get();
    }


    return datatables()->of($data)->make(true);
}

0
投票

您可以使用Eloquent::when()减少条件查询的if-else。

public function filterQuery(Request $request){

    $query = user::query();
    $query->select('user.*')->join('employee', 'employee.IC', '=', 'user.IC');

    $data = $query
        ->when(request('age') != null , function ($q) {
            return $query->where('user.age','>=',request('age'));
        })
        ->when(request('gender') != null , function ($q) {
            return $query->where('user.gender','<=',request('gender'));
        })
        ->when(request('income') != null , function ($q) {
            return $query->where('employee.income','<=',request('income'));
        })
        ->when(request('house_ownership') != null , function ($q) {
            return $query->where('employee.house_ownership','<=',request('house_ownership'));
        })
    ->get();

    return datatables()->of($data)->make(true);
}

0
投票

如果两个模型都有关系,则可以使用whereHas

    if(!empty($request->income) || !empty($request->house_ownership)){
        $query->whereHas('employee', function($q) use ($income, house_ownership) {
             if (!empty($income)) {
                  $q->where('income', $income);
             }
             if (!empty($house_ownership)) {
                  $q->where('house_ownership', $house_ownership);
             }             
        });
    }
...

或者您可以只使用join或leftjoin来过滤另一个表:

public function filterQuery(Request $request){

    $age = $request->age;
    $gender= $request->gender;
    $house_ownership = $request->house_ownership;
    $income= $request->income;

    $query = user::query();
    $query->leftjoin('employee', 'employee.IC', '=', 'user.IC');

    if(!empty($request->age)){
        $query->where('user.age','>=',$age );
    }

    if(!empty($request->gender)){
        $query->where('user.gender','<=',$gender);
    }

    if(!empty($request->income)){
        $query->where('employee.income', $income);
    }
    if(!empty($request->house_ownership)){
        $query->where('employee.house_ownership', $house_ownership);
    }
    $data = $query->select('user.*')->get();

    return datatables()->of($data)->make(true);
}
© www.soinside.com 2019 - 2024. All rights reserved.