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?
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.
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.
Essaye ça:
Vehicle::where('id',1)
->with(['staff'=> function($query){
// selecting fields from staff table
$query->select('id','name');
}])
->get();