Laravel обновить вычислить сумму много ко многим - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблема с обновлением чего-либо во многих отношениях с вычислением конца процесса. Для примера таблицы

stock_transports

enter image description here

stock_tranproduction_details

enter image description here

stock_entries

enter image description here

stock_entry_details

enter image description here

, если я нажму кнопка завершения в системе, я хочу обновить stock_transpotation_details с суммой кол-во с условием того же item_id и ref_code

, и результат, который я надеюсь, вот так

enter image description here

мой код прогресса, подобный этому

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 
                ];
     }
 }

, и после этого я обновляю stock_transport_detail или просто сбрасываю, а затем получаю неправильный результат, просто вычислите один из stock_entry_details, пожалуйста, помогите мне найти решение для кода или другой способ, например, с триггером mysql или лучшей логикой c

1 Ответ

1 голос
/ 02 апреля 2020

Я бы использовал здесь Laravel отношения, их прелесть в том, что они не должны работать только с целыми числами базы данных. В своем классе деталей запаса добавьте отношение к деталям транспорта. Предполагая, что ваши классы названы StockEntryDetail и StockTranportationDetail.

class StockEntryDetail {
    public function transportDetails() {
        return $this->hasMany(StockTranportationDetail::class, 'ref_code', 'ref_code');
    }
}

Чтобы иметь достойную производительность, я бы индексировал ref_code и 'item_id' в обеих таблицах.

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']);
});

Тогда вы можете оптимизировать свой код следующим образом. Найдите все StockDetails, которые имеют TransportDetails и item_id одинаковы, это делается с помощью запроса для быстрой производительности. Обновите данные, и все готово.

// 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();
}

Ваш объем и вопрос велики и немного сбивают с толку, я думаю, что я понимаю, и используя Laravel функции, я думаю, что решение чище и должно быть больше управляемый. Как правило, в Laravel когда вы начинаете преобразовывать ваши модели в массивы, вы делаете что-то не так, сохраняйте модели, поскольку вы всегда можете сохранить их в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...