Laravel Elocuente consulta de muchos a muchos donde

2 minutos de lectura

Avatar de usuario de Angelin Calu
angelin calu

En mi aplicación he actualizado una relación de one-to-many a many-to-many y estoy tratando de encontrar una manera de conservar la funcionalidad asociada.

Digamos que tengo dos tablas relacionadas, por ejemplo, perros y dueños. Si tengo una serie de propietarios y estoy tratando de obtener una lista de identificaciones de perros para esos propietarios, ¿cómo debo hacerlo de manera elocuente?

Se hizo una pregunta similar aquí:
https://laracasts.com/discuss/channels/laravel/getting-many-to-many-related-data-for-an-array-of-elements

Entonces, ¿cómo obtendría el Dog modelos donde Owner está en una matriz?

Lo mismo que $associatedDogs = Dog::whereIn('owner_id',$ListOfOwners)->get(); es para un One-To-Many relación, pero por Many-to-Many.

Avatar de usuario de Alexey Mezenin
Alexey Mezenin

Utilizar el whereHas() método:

$dogs = Dog::whereHas('owners', function($q) use($ownerIds) {
    $q->whereIn('id', $ownerIds);
})->get();

  • ¿Debo elegir el whereHas encima with ? ¿Cuál es la diferencia entre ellos en este caso? ¿Incluso hace alguna diferencia?

    – Angelín Calu

    9 de marzo de 2017 a las 10:01

  • No importa, encontré la explicación aquí: stackoverflow.com/a/30232227/2012740

    – Angelín Calu

    9 de marzo de 2017 a las 10:28

  • @AngelinCalu sí, with() no funcionará para usted, ya que carga datos de relación.

    – Alexei Mezenin

    9 de marzo de 2017 a las 13:15


  • @angelincalu no with() no trabajará. Cargará todos los perros y propietarios filtrados. whereHas() cargará solo perros con dueños que estén en la lista. Solo prueba ambos y verás la diferencia.

    – Alexei Mezenin

    9 de marzo de 2017 a las 13:28


  • Dice identificación ambigua en la cláusula ¿dónde hay alguna solución para eso?

    – Sagar Gautam

    5 de julio de 2020 a las 8:56

Probé las dos soluciones sugeridas, pero recibí un error que decía que la identificación no era única. Resolví así:

$dogs = Dog::whereHas('owners', function($q) use($ownerIds) {
    $q->whereIn('owner_id', $ownerIds);
})->get();

Avatar de usuario de EddyTheDove
EddyLa Paloma

Intentar

$associateDogs = Dog::with(['owners' => function($query) use ($listOfOwners) {
    $query->whereIn('id', $listOfOwners);
}])->get();

¿Ha sido útil esta solución?