web-dev-qa-db-fra.com

Laravel 4 Générateur de requêtes: LEFT JOIN ... AND ... query

J'essaie de sélectionner tous les résultats d'une table et de les fusionner avec une autre table lorsque l'ID utilisateur correspond.

J'ai trois tables: exécutions, utilisateurs et un tableau croisé dynamique run_user. Je souhaite sélectionner tous les résultats des "analyses" et des colonnes supplémentaires du tableau croisé dynamique ("terminé", "collant", "last_tested" et "difficulté"), mais extraire uniquement les données de run_user pour l'utilisateur actuel.

En SQL brut, j'ai réussi à le faire via un LEFT JOIN avec une instruction AND:

SELECT
runs.startpoint,
runs.startpostcode,
runs.endpoint,
runs.endpostcode,
run_user.completed,
run_user.sticky,
run_user.last_tested,
run_user.difficulty
FROM runs
LEFT JOIN run_user ON run_user.run_id=runs.id AND run_user.user_id = '2'

Des suggestions sur la manière de procéder via le Générateur de requêtes? Je peux faire le LEFT JOIN dans Laravel 4 mais je ne vois pas non plus comment le combiner avec une instruction AND.

Toute aide est appréciée.

Merci!

16
user2324369

Comme vous l'avez demandé, voici comment vous feriez votre requête avec le générateur de requêtes:

DB::table('runs')
        ->leftJoin('run_user', function($join)
        {
            $join->on('run_user.run_id', '=', 'runs.id')
            ->on('run_user.user_id', '=', '2');
        })
        ->get();

Mais cette instruction JOIN semble un peu étrange, vous voudrez probablement la transformer en un WHERE normal (à moins que vous n'ayez une raison très précise de filtrer directement dans la clause JOIN).

DB::table('runs')->join('run_user', 'run_user.run_id', '=', 'runs.id')->where('run_user.user_id', '=', '2')->get();

Docs: http://laravel.com/docs/queries#joins

32
Alexandre Danault

Au cas où quelqu'un se demanderait si cela fonctionnait avec DB :: raw sur l'un des paramètres leftJoin:

DB::table('runs')
    ->leftjoin('run_user', 'runs.id','=', 
      DB::raw('run_user.run_id AND run_user.user_id = ' . $user->id))
    ->get();

Ce n'est pas aussi «éloquent» que je le souhaiterais, mais sans condition de travail «and On», cela semble être le seul moyen d'ajouter un AND à la jointure gauche.

Si quelqu'un peut suggérer une manière plus ordonnée, j'aimerais bien le savoir!

Merci

9
user2324369

Dans Laravel 4, vous pouvez utiliser une requête Eloquent. Je suppose que vous connaissez les relations Eloquent et savez créer des modèles .

RunUser::where('user_id',$id)->leftjoin('runs','runs.id','=','run_user.run_id')->first();

Remarque RunUser est le modèle de la table run_user.

1
Trying Tobemyself

utilisez ceci

DB::table('runs')->select('runs.startpoint','runs.startpostcode','runs.endpoint','runs.endpostcode','run_user.completed','run_user.sticky','run_user.last_tested','run_user.difficulty')
    ->leftJoin('run_user', function($join)
    {
        $join->on('run_user.run_id', '=', 'runs.id')
        ->where('run_user.user_id', '2');
    })
    ->get();
1
Saurav Lal Karn

Provident et table utilisateur Joignez-vous et obtenez l’id de tous les détails.

   $return = DB::table(config::get('databaseconstants.TBL_USER'))
            ->leftjoin('inex_pf_details', 'inex_users.id', '=', 'inex_pf_details.pf_user_id')
            ->select('inex_pf_details.*','inex_users.*')
            ->where('inex_pf_details.id', $id)
            ->first();
    return $return;
0
Hardik Hihoriya

Voici doit travailler:

DB::table('runs')
        ->leftJoin('run_user', function($join) use ($user_id)
        {
            $join->on('run_user.run_id', '=', 'runs.id')
            ->where('run_user.user_id', '=', $user_id);
        })
        ->get();
0
Denis Ch