Saltar al contenido

Laravel Eloquent ORM “whereHas” a través de la tabla

Sé libre de divulgar nuestros post y códigos en tus redes, apóyanos para aumentar nuestra comunidad.

Solución:

Tienes 3 opciones usando relaciones:

1 solución más sencilla:

Places::whereHas('contacts',function ($q) use ($city_id)
       $q->whereHas('cities', function ($q) use ($city_id)
           $q->where('id', $city_id);
        );
    )->get();

2 igual que arriba pero usando este PR: https://github.com/laravel/framework/pull/4954

Places::whereHas('contacts.cities', function ($q) use ($city_id)
        $q->where('id', $city_id);   
    )->get();

3 Uso hasManyThrough relación:

// Place model
public function cities()

  return $this->hasManyThrough('City', 'Contact');


// then
Places::whereHas('cities',function ($q) use ($city_id)
   $q->where('cities.id', $city_id);
)->get();

editar

Teniendo su esquema, es obvio que ninguna de las sugerencias o su configuración original puede funcionar.

Esta es una relación de muchos a muchos que en Eloquent es belongsToMany:

// Places model
public function cities()

  return $this->belongsToMany('Cities', 'contacts', 'places_id', 'cities_id')
    ->withPivot( .. contacts table fields that you need go here.. );


// Cities model
public function places()

  return $this->belongsToMany('Places', 'contacts', 'cities_id', 'places_id')
    ->withPivot( .. contacts table fields that you need go here.. );

Entonces puedes llamar a relaciones como esta:

$city = Cities::first();
$city->places; // collection of Places models

// contacts data for a single city-place pair
$city->places->first()->pivot->open_hours; // or whatever you include in withPivot above

Ahora, hay otra forma de configurar esto, en caso de que también necesite Contacts modelo en sí:

// Places model
public function contact()

  return $this->hasOne('Contacts', 'places_id');


// Contacts model
public function city()

  return $this->belongsTo('Cities', 'cities_id');


public function place()

  return $this->belongsTo('Places', 'places_id');


// Cities model
public function contact()

  return $this->hasOne('Contacts', 'cities_id');

después:

$city = Cities::first();
$city->contact; // Contacts model
$city->contact->place; // Places model

hasManyThrough no funcionará aquí en absoluto

Comentarios y valoraciones

Si te mola la idea, tienes la opción de dejar una reseña acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *