Saltar al contenido

¿Cómo AGRUPAR y SUMAR una columna de tabla dinámica en una relación Elocuente?

Poseemos la mejor información que hallamos on line. Nosotros deseamos que te sea útil y si quieres compartir cualquier detalle que nos pueda ayudar a mejorar hazlo libremente.

Trate de sumar Collection,

$project->parts->sum('pivot.count');

Esta es la mejor manera que encontré. Es limpio (fácil de leer) y puede reutilizar todo su alcance, orden y relación. attribute almacenamiento en caché parts Definición de muchos a muchos.

@hebron No hay problema N+1 para esta solución si usa with('parts') a la carga ansiosa. Porque $project->parts (sin que llamada de función) es un caché attribute, devuelva una instancia de Collection con todos sus datos. Y sum('pivot.count') es un método de Collection que contiene ayudantes funcionales puros (no relativos a la base de datos, como el guión bajo en js world).

Ejemplo completo:

Definición de partes de relación:

class Project extends Model

    public function parts()
    
        return $this->belongsToMany('Part', 'project_part', 'project_id', 'part_id')
            ->withPivot('count')
            ->withTimestamps();
    

Cuando lo use (tenga en cuenta que la carga ansiosa es importante para evitar el problema N + 1),

AppProject::with('parts')->get()->each(function ($project) 
    dump($project->parts->sum('pivot.count'));
);

O puede definir la función de suma en Project.php,

class Project extends Model

    ...

    /**
     * Get parts count.
     *
     * @return integer
     */
    public function partsCount()
    
        return $this->parts->sum('pivot.count');
    

Si quieres evitar with('parts') en el lado de la persona que llama (partes de carga ansiosas por defecto), puede agregar un $with attribute

class Project extends Model

    /**
     * The relations to eager load on every query.
     *
     * @var array
     */
    protected $with = ['parts'];

    ...

Desde el código fuente:

Necesitamos crear un alias para todas las columnas dinámicas con “pivot_” prefix para que podamos extraerlos fácilmente de los modelos y colocarlos en las relaciones de pivote cuando se recuperan e hidratan en los modelos.

Así que puedes hacer lo mismo con select método

public function parts()

    return $this->belongsToMany('Part', 'project_part', 'project_id', 'part_id')
        ->selectRaw('parts.*, sum(project_part.count) as pivot_count')
        ->withTimestamps()
        ->groupBy('project_part.pivot_part_id')

Si crees que te ha resultado útil este artículo, sería de mucha ayuda si lo compartieras con más juniors y nos ayudes a difundir nuestro contenido.

¡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 *