Tengo un problema acerca de la actualización algo en relación muchos a muchos con calcula de final de proceso. Por ejemplo mesa
stock_transports
stock_tranportation_details
stock_entries
stock_entry_details
si el botón de completo en el sistema de clic, quiero stock_transpotation_details actualización con suma de cant con la condición misma item_id y ref_code
y el resultado espero como esto
mi código de progreso como éste
foreach($stockEntry->stock_transport->details()->get() as $detail) {
$arr[$detail->item_id.'_'.$detail->ref_code] = $detail->id;
}
$total_qty = 0;
foreach($stockEntry->details as $detail) {
if($arr[$detail->item_id.'_'.$detail->ref_code]) {
$total_qty += $detail->qty;
$arr[$detail->item_id.'_'.$detail->ref_code] = [
'qty' => $total_qty,
'ref_code' => $detail->ref_code,
'item_id' => $detail->item_id
];
}
}
y después de que la actualización stock_transport_detail i o simplemente volcar luego obtuvo un resultado erróneo, su sólo un cálculo de los stock_entry_details ayuda Plese me encontrar la solución para el código u otra manera, por ejemplo, con el disparador de MySQL o mejor la lógica
Me gustaría utilizar relaciones laravel aquí, la belleza de esos, es que no tienen que trabajar con bases de datos sólo enteros. En su clase de detalles comunes, añadir una relación a los detalles del transporte. Suponiendo que sus clases se nombra StockEntryDetail
y StockTranportationDetail
.
class StockEntryDetail {
public function transportDetails() {
return $this->hasMany(StockTranportationDetail::class, 'ref_code', 'ref_code');
}
}
Para tener un rendimiento respetable, me gustaría índice ref_code
y 'item_id' en ambas mesas.
Schema::create('stock_entry_details', function (Blueprint $table) {
$table->index(['ref_code', 'item_id']);
});
Schema::create('stock_tranportation_details', function (Blueprint $table) {
$table->index(['ref_code', 'item_id']);
});
A continuación, puede optimizar el código a la siguiente. Buscar todas las StockDetails que tiene TransportDetails y la item_id es el mismo, esto se hace con una consulta para un rendimiento rápido. Actualizar los datos y ya está.
// Eager load the relationships we are going over
$stockEntry = StockEntry::with('details.transportDetails')->find($id);
foreach ($stockEntry->details as $detail) {
// find all with the same item_id, ref_code is done by relationship.
$transportDetailsCount = $detail->transportDetails()->where('item_id')->count()
// update your data
$detail->qty = $transportDetailsCount;
$detail->save();
}
Su alcance y la pregunta es grande y un poco confuso, creo que lo entiendo y mediante la utilización de Laravel
características, creo que la solución es más limpio y debería ser más manejable. En general Laravel
cuando se empieza a convertir sus modelos en matrices que está haciendo algo mal, mantener a los modelos que siempre se puede guardar em a la base de datos.