0
votes

Comment joindre des tables avec plus d'une correspondance d'attribut?

J'essaie de transformer mon sql brut en générateur de requêtes laravel et je rencontre des difficultés sur la façon de joindre plusieurs tables en utilisant avec de nombreux attributs match.

Dans ce cas, je veux joindre les tables jr_h et jr_d avec trois attributs match (livre, p_seq et staff_code) plutôt qu'un (livre). SQL brut:

   $jr_d = DB::table('jr_d')
        ->join('jr_h', 'jr_d.book', '=', 'jr_h.book')
        ->join('astaff', 'jr_d.staff_code', '=', 'astaff.staff_code')
        ->select('jr_h.*','jr_d.*','astaff.*','astaff.name_t as staff_name')
        ->where('jr_d.ref_group','=','E')
        ->get();

Générateur de requêtes Laravel:

 $sql =  "select from_time,to_time,t.staff_code,s.name_t as staff_name,t.book,t.p_code,t.p_seq,p.hrs1,s.img_file, 
        t.hrs_work,p.sharing_cnt  as hrs_work, t.hrs_ot  as hrs_ot from jr_d as t 
        inner join jr_h as p on(t.book=p.book and t.p_seq=p.p_seq and t.staff_code=p.staff_code)  
        inner join astaff as s on(t.staff_code=s.staff_code) ";

et souhaitez également savoir s'il existe un moyen de requête plus rapidement car il contient beaucoup de données dans les tableaux.


0 commentaires

3 Réponses :


1
votes

Essayez ceci:

// ...
->join('jr_h p', function($join) {
   $join->on('t.book', '=', 'p.book');
   $join->on('t.p_seq', '=', 'p.p_seq');
// ... more conditions
});


4 commentaires

oui ça marche, comment le rendre plus rapide? j'attends 3 minutes pour que ça marche ...


Eh bien, les performances ne sont probablement pas liées à la requête écrite dans Laravel DB Builder. Vous devrez peut-être définir des index sur différentes colonnes si ce n'est déjà fait.


Je demande beaucoup en fonction de la date, cela signifie que je devrais définir un index sur la colonne de date pour la plupart des tables?


Définir un index sur la colonne de date peut améliorer ses performances



1
votes

Laravel rejoint avec plusieurs conditions:

$results = DB::table('jr_d')
            ->select('jr_h.*','jr_d.*','astaff.*','astaff.name_t as staff_name')
            ->join('jr_h', 'jr_d.book', '=', 'jr_h.book')
            ->join('jr_h as p', function($query){
                $query->on('t.book','=', p.book');
                $query->on('t.p_seq','=', 'p.p_seq');
                $query->on('t.staff_code', '=', 'p.staff_code');
            })
            ->where('jr_d.ref_group','=','E')
            ->get();
    `


2 commentaires

oui ça marche, comment le rendre plus rapide? j'attends 3 minutes pour que ça marche ...


@QiYang alors veuillez accepter la réponse, en général, la requête est presque une instruction SQL brute et vous n'avez vraiment pas beaucoup d'options sur la façon de la rendre plus rapide, car plusieurs jointures avec plusieurs conditions la ralentissent. Une suggestion pour accélérer les choses consiste à ajouter une indexation aux tables que vous joignez.



0
votes

Essayez ceci.

$jr_d = DB::table('jr_d')
        ->join('jr_h', 'jr_d.book', '=', 'jr_h.book')
        ->join('astaff', 'jr_d.staff_code', '=', 'astaff.staff_code')
        ->select('*','astaff.name_t as staff_name')
        ->where('jr_d.ref_group','=','E')
        ->get();


0 commentaires