3 votes

Comment effectuer une jointure de tables par ID en tant que clé primaire dans une requête -laravel

Je veux créer une fonction où je filtre en fonction de 2 tables de base de données. Cependant, je ne suis pas sûr de comment inclure la table de jointure dans la requête. Cela signifie que les données seront filtrées à partir de deux tables (tables utilisateur et employé) avant de renvoyer le résultat au datatable.

Ma requête de filtre est

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);
}

La table que je veux joindre dans la requête est la table employé (colonnes = revenu et propriété de la maison) et la clé primaire qui relie les deux tables est IC.

2voto

TsaiKoga Points 438

Si vous avez une relation dans les deux modèles, vous pouvez utiliser 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);
             }             
        });
    }
...

Ou vous pouvez simplement utiliser join ou leftjoin pour filtrer une autre table :

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);
}

1voto

Vikas Katariya Points 4713

Essayer ceci

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);
}

1voto

nick huang Points 51

Vous pouvez utiliser Eloquent::when() pour réduire les if-else pour les requêtes conditionnelles.

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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X