with wherepivot updateorcreate meaning hasmany example php laravel eloquent

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