> Faqs > Ordenar una relación muchos a muchos de Laravel por un campo de la tabla pivote

Ordenar una relación muchos a muchos de Laravel por un campo de la tabla pivote

Hola!

Tengo una relación de muchos a muchos (n a m) con Laravel Eloquent.

public function tags() {
    return $this->belongsToMany('App\Tag', 'user_has_tags');
}

El caso es que quiero hacer un orden específico para que al traerme los datos relacionados me los devuelva ordenados.

Lo que he intentado es hacer un orderBy en la declaración de la relación.

public function tags() {
    return $this->belongsToMany('App\Tag', 'user_has_tags')->orderBy('updated_at');
}

Esto funciona bien. Me devuelve los datos relacionados ordenados, pero los ordena por la entidad relacionada. Por ejemplo, en este caso, daría los tags ordenados por el campo "updated_at" de la tabla "tags".

Sin embargo, mi intención no era esa, sino ordenar por un dato de la tabla pivote. Yo quiero que me los ordene según han sido introducidos en la tabla pivote, o según algún campo extra de los que hay en la tabla pivote.

En fin ¿Cómo se puede ordenar una relación muchos a muchos de Laravel por un campo de la tabla pivote?

Respuestas

Para ordenar los datos relacionados atendiendo al contenido de la tabla pivote tienes que hacer dos cosas:

  • En la relación traes datos de la tabla pivote con "withPivot"
  • A continuación ordenas por los campos que te has traído de la tabla pivote, haciendo la notación tabla_pivote.campo_a_ordenar

El código en tu modelo te quedará así, más o menos:

public function tags() {
    return $this->belongsToMany('App\Tag', 'user_has_tags')
        ->withPivot('updated_at')
        ->orderBy('user_has_tags.updated_at', 'desc');
}
Miguel Angel
3310 147 216 17