Saltar al contenido

Relaciones de fusión de Laravel

Si hallas alguna incompatibilidad con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes añadir el código al trabajo final.

Pruebe el método getter para la propiedad que devuelve colecciones fusionadas devueltas por relaciones.

public function getCompetitionsAttribute($value)

    // There two calls return collections
    // as defined in relations.
    $competitionsHome = $this->competitionsHome;
    $competitionsGuest = $this->competitionsGuest;

    // Merge collections and return single collection.
    return $competitionsHome->merge($competitionsGuest);

O puede llamar a métodos adicionales antes de que se devuelva la colección para obtener diferentes conjuntos de resultados.

public function getCompetitionsAttribute($value)

    // There two calls return collections
    // as defined in relations.
    // `latest()` method is shorthand for `orderBy('created_at', 'desc')`
    // method call.
    $competitionsHome = $this->competitionsHome()->latest()->get();
    $competitionsGuest = $this->competitionsGuest()->latest()->get();

    // Merge collections and return single collection.
    return $competitionsHome->merge($competitionsGuest);

En caso de que prefiera el método merge() para combinar dos colecciones (relaciones), anulará los elementos con el mismo índice keys por lo que perderá algunos de los datos obtenidos de una relación.

Debería elegir el método push() en su lugar, que crea nuevos array keys empujando una colección al final de otra colección

Aquí hay una muestra:

public function getCompetitionsAttribute($value) 
    $competitionsHome = $this->competitionsHome;
    $competitionsGuest = $this->competitionsGuest;

    // PUSH ONE TO OTHER!
    return $competitionsHome->push($competitionsGuest);

Creé un paquete para fusionar relaciones usando vistas:
https://github.com/staudenmeir/laravel-merged-relations

Primero, cree la vista de combinación en una migración:

use StaudenmeirLaravelMergedRelationsFacadesSchema;

Schema::createMergeView(
    'competitions',
    [(new YourModel)->CompetitionsHome(), (new YourModel)->CompetitionsGuest()]
);

Luego define la relación:

class YourModel extends Model

    use StaudenmeirLaravelMergedRelationsEloquentHasMergedRelationships;

    public function competitions()
    
        return $this->mergedRelationWithModel(Competition::class, 'competitions');
    

Úselo como cualquier otra relación:

$model->competitions;

$model->competitions()->paginate();

YourModel::with('competitions')->get();

Calificaciones y reseñas

Si te gusta la informática, tienes la libertad de dejar un post acerca de qué te ha parecido esta noticia.

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


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

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