php - multitabla - consultas eloquent laravel
Laravel Eloquent y relaciones complejas (1)
Laravel parece un marco de PHP muy bueno, incluido con un buen ORM (Eloquent). Sin embargo, los documentos de Laravel son algo que falta. Solo las cosas básicas están presentes en el documento.
De todos modos, tengo un problema cuando se trata de relaciones Eloquent y modelo cuando abarca más de 2 modelos.
Por ejemplo, tengo el siguiente escenario.
Tengo cuatro tablas de base de datos a saber: users
, locations
, locations
users_locations
, packages
. Y la relación entre el modelo / tablas es la siguiente:
El usuario puede pertenecer a muchas ubicaciones y viceversa. Una ubicación puede tener muchos paquetes.
Y mis relaciones modelo correspondientes son las siguientes:
//User Model:
public function locations(){
return $this->belongsToMany(''Location'', ''users_locations'', ''user_id'', ''location_id'');
}
//Location Model:
public function users(){
return $this->belongsToMany(''User'', ''users_locations'', ''location_id'', ''user_id'');
}
public function packages(){
return $this->hasMany(''Package'', ''location_id'');
}
//Package Model:
public function location(){
return $this->belongsTo(''Location'', ''location_id'');
}
¿Qué quiero hacer? : Quiero que todos los paquetes pertenezcan a un usuario. Un usuario pertenece a ubicaciones y los paquetes también pertenecen a ubicaciones. Entonces, de todas las ubicaciones que pertenecen al usuario, quiero recuperar los paquetes que pertenecen a esas ubicaciones del usuario. También quiero que el conjunto de resultados esté paginado.
He probado lo siguiente:
//get the logged in user ID
$userId = Auth::user()->id
//first get all the locations of the user
$locations= User::with(''locations'')->find($userId)->locations;
//declare an empty array to store the packages
$packages = array();
//now loop through the locations
foreach($locations as $location){
//since each location can have many packages, we also have to loop through the packages
foreach($location->packages as $package){
//store the plan in the array
$packages[] = $package;
}
}
//ok now we got the list of packages
return $packages;
El problema es que, con lo anterior, no puedo implementar la paginación en los paquetes. ¿Alguien sabe cómo hacerlo correctamente y de manera eficiente con Eloquent? ¿O simplemente no es posible?
//get the logged in user ID
$userId = Auth::user()->id
//first get all the locations of the user
$locations= User::with(''locations'')->find($userId)->locations;
/* perhaps you can alternatively use lists() function to get the ids
something like: $loc_ids = DB::table(''locations'')->where(''user_id'',$userId)->lists(''id''); */
$loc_ids = array();
foreach($locations as $location)
{
$loc_ids[] = $location->id;
}
$packages = Package::whereIn(''location_id'', $loc_ids)->skip($offset)->take($page_size)->get();
return $packages;