2017-02-14 5 views
1

Я пытаюсь добавить общую сумму каждого receiptitems->value за квитанцию ​​/ родитель.Добавление общей суммы каждого элемента элемента массива по ключу в Laravel, Blade или PHP

Идеальный результат - прохождение квитанций и отображения;

receipt->id 
receipt->merchant 
receipt->totalValue 

Общее значение каждого из дочерних значений (то есть всего значения квитанции).

Пример JSON выход:

[ 
    { 
     "id":1, 
     "user_id":1, 
     "image":"58a31ba406d16.jpg", 
     "merchant":"Tesco", 
     "created_at":"2016-04-23 22:02:58", 
     "receiptitems":[ 
     { 
      "receipt_id":1, 
      "category_id":2, 
      "value":5285 
     }, 
     { 
      "receipt_id":1, 
      "category_id":5, 
      "value":5231 
     }, 
     { 
      "receipt_id":1, 
      "category_id":5, 
      "value":6822 
     } 
     ] 
    }, 
    { 
     "id":2, 
     "user_id":1, 
     "image":"58a31ba4073c8.jpg", 
     "merchant":"Tesco", 
     "created_at":"2016-09-19 02:55:38", 
     "receiptitems":[ 
     { 
      "receipt_id":2, 
      "category_id":2, 
      "value":7009 
     }, 
     { 
      "receipt_id":2, 
      "category_id":7, 
      "value":2147 
     } 
     ] 
    }, 
    { 
     "id":3, 
     "user_id":1, 
     "image":"58a31ba407a26.jpg", 
     "merchant":"Tesco", 
     "created_at":"2016-08-06 12:30:27", 
     "receiptitems":[ 
     { 
      "receipt_id":3, 
      "category_id":7, 
      "value":4598 
     }, 
     { 
      "receipt_id":3, 
      "category_id":2, 
      "value":8799 
     }, 
     { 
      "receipt_id":3, 
      "category_id":3, 
      "value":773 
     } 
     ] 
    }, 
    { 
     "id":4, 
     "user_id":1, 
     "image":"58a31ba407e69.jpg", 
     "merchant":"Tesco", 
     "created_at":"2016-12-10 21:21:43", 
     "receiptitems":[ 
     { 
      "receipt_id":4, 
      "category_id":5, 
      "value":883 
     }, 
     { 
      "receipt_id":4, 
      "category_id":5, 
      "value":3013 
     }, 
     { 
      "receipt_id":4, 
      "category_id":2, 
      "value":1013 
     }, 
     { 
      "receipt_id":4, 
      "category_id":1, 
      "value":3243 
     } 
     ] 
    }, 
    { 
     "id":5, 
     "user_id":1, 
     "image":"58a31ba408187.jpg", 
     "merchant":"Tesco", 
     "created_at":"2017-01-18 14:12:16", 
     "receiptitems":[ 
     { 
      "receipt_id":5, 
      "category_id":7, 
      "value":1355 
     }, 
     { 
      "receipt_id":5, 
      "category_id":1, 
      "value":1547 
     }, 
     { 
      "receipt_id":5, 
      "category_id":1, 
      "value":1640 
     }, 
     { 
      "receipt_id":5, 
      "category_id":1, 
      "value":2466 
     }, 
     { 
      "receipt_id":5, 
      "category_id":8, 
      "value":2689 
     } 
     ] 
    } 
] 

Я пытался в контроллере, а также в шаблонах лезвий, и я не могу получить результат, что мне нужно. Я смотрел на array_sum() http://php.net/manual/en/function.array-sum.php, но я не уверен, как его реализовать.

Я пытался в RecriptsController:

$receipts = Receipt::where('user_id', Auth::id()) 
    ->with('receiptitems') 
    ->get(); 

foreach ($receipts as $receipt) { 
    $result = array_sum($receipt->receiptitems->value); 
}; 

return $result; 

А также в шаблоне клинка:

@foreach($receipts as $receipt) 
    <li>{{ $receipt->merchant }}</li> 
    <ul> 
    @foreach($receipt->receiptitems as $item) 
     <li>{{ array_sum($item->value) }}</li> 
    @endforeach 
    </ul> 
@endforeach 

ответ

3

Как правило, вы хотите array_column в сочетании с array_sum:

foreach ($receipts as $receipt) { 
    $total = array_sum(array_column($receipt['receiptitems'], 'value')); 
    print_r($total); 
} 

array_column вытаскивает ключи value от поддиапазона receiptitems. Затем array_sum суммирует их. Но у вас есть коллекция объектов, так что вы на самом деле нужен немного другой подход, основанный на array_map:

foreach ($receipts as $receipt) { 
    $total = array_sum(array_map(function ($o) { return $o->value; }, $receipt->receiptitems)); 
    print_r($total); 
} 

Как и в стороне, вы можете рассмотреть Receipt::getTotalAttribute() мутатор, который будет возвращать общее количество пунктов и к упростите взаимодействие с моделью.

+0

Спасибо за ответ. Я получаю 'array_column() ожидает, что параметр 1 будет массивом, object given' error –

+0

Похож на коллекцию. Возможно, вы хотите передать его в массив с помощью '(array)' или использовать '-> toArray()' или эквивалентный метод литья. – bishop

+0

Я добавил 'return $ total-> toArray();' вне цикла, и я все равно получаю ту же ошибку (ссылаясь на вторую строку в вашем примере). –

0

Хотя ответы на вопросы и я получил результат, который я хотел. Друг помог мне с другим вариантом (Коллекции), который также работал:

public function index() 
{ 
    $receipts = Receipt::where('user_id', Auth::id()) 
     ->with('receiptitems') 
     ->get(); 

    $collection = collect($receipts); 
    $data = $collection->map(
     function($receipt) { 
      $r = new stdClass; 
      $r->id = $receipt->id; 
      $r->merchant = $receipt->merchant; 
      $r->amount = collect($receipt->receiptitems)->pluck('value')->sum(); 
      $r->date = $receipt->date; 
      return $r; 
     } 
    ); 

    return view('transactions', compact('data')); 
} 

Надеюсь, это поможет кому-то еще.