web-dev-qa-db-fra.com

Comment sélectionner les colonnes des tables jointes: laravel eloquent

J'ai un problème différent de this . Le scénario est le même mais j'ai besoin de plus de filtrage des résultats.

Laisse-moi expliquer.

Considérez que j'ai 2 tables

véhicules

 id
 name
 staff_id
 distance
 mileage

personnel

 id
 name
 designation

Je souhaite sélectionner uniquement id et name dans les deux tableaux (modèles). Le modèle de véhicule contient une relation belongsTo avec le modèle du personnel.

class Vehicle extends Model
{
    public function staff()
    {
      return $this->belongsTo('App\Staff','staff_id');
    }
}

et j'ai rejoint en utilisant ce

Vehicle::where('id',1)
            ->with(['staff'=> function($query){
                            // selecting fields from staff table
                            $query->select(['staff.id','staff.name']);
                          }])
            ->get();

Quand je mets des champs dans ->get() comme ça

->get(['id','name'])

il filtre la table vehicle mais ne produit aucun résultat de la table Staff.

Des idées?

7
Anil P Babu

Enfin trouvé .. Dans la ->get() vous devez mettre le 'staff_id' comme ceci

Vehicle::where('id',1)
            ->with(['staff'=> function($query){
                            // selecting fields from staff table
                            $query->select(['staff.id','staff.name']);
                          }])
            ->get(['id','name','staff_id']);

Puisque je n'ai pas pris le staff_id, il n'a pas pu effectuer la jointure et les champs de la table des employés ne sont donc pas affichés.

7
Anil P Babu

Vous pouvez utiliser une jointure normale comme ceci:

Vehicle::join('staff','vehicles.staff_id','staff.id')
         ->select(
                  'vehicles.id',
                  'vehicles.name',
                  'staff.id as staff_id',
                  'staff.name'
          )
         ->get();

Depuis, vous ne pouvez pas prendre les deux id à la fois dans une jointure car une seule est autorisée. Ainsi, vous pouvez utiliser l'ID du personnel comme staff_id.

Vous pouvez ajouter une condition d'ID de véhicule avec une clause where comme:

Vehicle::join('staff','vehicles.staff_id','staff.id')
         ->where('vehicle.id',1)
         ->select(
                  'vehicles.id',
                  'vehicles.name',
                  'staff.id as staff_id',
                  'staff.name'
          )
         ->get();

J'espère que tu as compris.

3
Sagar Gautam

Essaye ça:

Vehicle::where('id',1)
    ->with(['staff'=> function($query){
        // selecting fields from staff table
        $query->select('id','name');
    }])
    ->get();
1
Maraboc