Объединять и суммировать предметы с одинаковым идентификатором - PullRequest
0 голосов
/ 30 сентября 2018

Используя Laravel и PHP, я должен объединить элементы с одинаковым product_id, чтобы узнать, сколько из них у меня есть на складе.Я забираю все товары на текущем складе и получаю.

array:3 [▼
  0 => array:5 [▼
    "factor" => -1
    "quantity" => 14
    "product_name" => "Phone"
    "product_id" => 1
    "product_symbol" => "iP"
  ]
  1 => array:5 [▼
    "factor" => 1
    "quantity" => 120
    "product_name" => "Phone"
    "product_id" => 1
    "product_symbol" => "iP"

  ]
  2 => array:5 [▼
    "factor" => -1
    "quantity" => 5
    "product_name" => "Sam Washing Machinge"
    "product_id" => 2
    "product_symbol" => "Sa_DA123WE"

  ]
]

Теперь в моем представлении я хочу отобразить текущий статус инвентаря:

<tbody>
                    @foreach($values as $key => $value)
                        <tr>
                            <td>{{$key+1}}</td>
                            <td>{{$value->product_name}}</td>
                            <td>{{$value->product_symbol}}</td>
                            <td>{{$value->quantity}}</td>
                        </tr>
                    @endforeach
                    </tbody>

Проблема в том, что это вызывает:

Name: Symbol: Quantity:
Phone iP          14
Phone iP          120
Sam   Sa           5

Итак, как вы видите, у меня есть две записи с телефоном и должна быть только одна, потому что это один и тот же элемент, который должен быть рассчитан следующим образом:

(foreach products with the same id factorOfTheFirstItem*quantityOfTheFirstItem + factorOfTheSecondItem*quantityOfTheSecondItem and so).

Такнаконец мой сайт должен выглядеть:

Name: Symbol: Quantity:
Phone iP          106
Sam   Sa           5

Контроллер:

$values= Document::where('id_warehouse', $warehouseId)
            ->leftJoin('document_items', 'documents.id', '=','document_items.document_id')
            ->leftJoin('products', 'products.id', '=', 'document_items.product_id')
            ->select('documents.factor as factor', 'document_items.quantity as quantity','products.name as product_name','products.id as product_id','products.symbol as product_symbol')

    ->get()->toArray();
return view('admin.inventory.index', compact('values'));

Спасибо за помощь!:)

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Не вызывать функцию toArray().потому что его слишком легко обрабатывать Collections.Итак,

$documents = Document::whateverYourQuery()->get();

// final collection which will hold 'merged data'
$merged_documents = collect();

foreach($documents as $document) {

    // set a new attribute with 'factoredquantity'
    $document->setAttribute('factored_quantity', $document->factor . $document->quantity);

    // set a new attribute with sum of the 'factored quantity' (which is what you need)
    $document->setAttribute('total_quantity', $documents->sum->factored_quantity);

    // set updated 'document' object to the final collection.
    // put function will eliminate duplicates.
    $merged_documents->put($document->id, $document);

}

теперь в каждом вашем объекте документа есть атрибут общего количества, к которому вы можете получить доступ как $document->total_quantity

, наконец, вы можете вызвать функцию toArray() для коллекции 'merged_data', если хотите.

0 голосов
/ 30 сентября 2018

Исходя из того, что вы хотите в итоге (следующее):

Name: Symbol: Quantity:
Phone iP          106
Sam   Sa           5

Вы можете улучшить свой запрос и получить этот результат довольно легко, что-то вроде этого должно работать:

$documents = Document::where('id_warehouse', $warehouseId)
        ->leftJoin('document_items', 'documents.id', '=','document_items.document_id')
        ->leftJoin('products', 'products.id', '=', 'document_items.product_id')
        ->select(
            DB::raw('SUM(document_items.quantity) as quantity'),
            'products.name as product_name',
            'products.id as product_id',
            'products.symbol as product_symbol'
          )
         ->groupBy('products.name', 'products.id', 'products.symbol')
         ->get();

При этом вы должны получить массив с теми же свойствами, что и вы.

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