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.