php - updateorcreate - wherepivot laravel
Laravel elocuente contando una relaciĆ³n (3)
Soy nuevo en laravel y elocuente y no estoy seguro de si esto es posible. pero tengo 2 tablas con una relación de uno a muchos. Uno es "ubicaciones" y uno es "usuarios". Una ubicación puede tener muchos usuarios.
Entonces, si quisiera obtener todas las ubicaciones con todos los usuarios, simplemente haría esto:
Location::with("users")->get();
Pero también quiero saber cuántos usuarios tiene cada ubicación, intenté hacer esto
Location::with("users")->count("users")->get();
Pero eso no funcionó.
Debe llamar al método de conteo en cada registro de ubicación para que los usuarios cuenten por ubicación, aquí hay un ejemplo:
foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location)
{
echo $location->users()->count();
}
Esto debería resolver su problema y darle la cantidad de usuarios por cada ubicación. Puede agregar una marca en el ciclo para ignorar las ubicaciones con count = 0 de los usuarios
Deberías usar solo withCount
pero supongo que no estaba disponible en 2012.
Entonces, así es como debería verse:
Location::with("users")->withCount("users")->get();
Y tendrá un atributo users_count
disponible en su objeto.
Lea los documentos para obtener más detalles: https://laravel.com/docs/5.5/eloquent-relationships#querying-relations (desplácese un poco hacia abajo y verá Contando Modelos Relacionados )
El problema n + 1 que se mencionó no ocurre si usa carga ansiosa.
$locations = Location::with(''users'')->get();
$locations->users()->count();
Esto debería generar tres consultas, sin importar cuántos usuarios o ubicaciones tenga.
- consulta de conteo contra el modelo de ubicación
- seleccionar * desde ubicaciones
- seleccione * de usuarios en donde
La confusión surge del hecho de que esto también funciona:
$locations = Location::all();
$locations->users()->count();
Pero en este caso, consulta una vez para cada ubicación.
Consulte los documentos para obtener más información: http://laravel.com/docs/eloquent#eager-loading