Невозможно преобразовать ассоциативный массив в полную коллекцию в Laravel с помощью функции collect () - PullRequest
0 голосов
/ 12 июля 2019

Я работаю над созданием веб-приложения для инвентаризации денег с помощью Laravel.

Я организовал таблицы в users, где у пользователя может быть много accounts, что является отношением многих ко многим.через таблицу account_user.Для каждой учетной записи есть записи для transactions.В аккаунте много транзакций.

В таблице transactions я храню счет и количество.Итак, таблица транзакций имеет следующие столбцы:

  • account_id
  • bill_id
  • datetime
  • номер_ транзакции
  • количество

Внутри таблицы bills столбец name относится к номиналу счета, то есть к 20 счету => как счет в 20 долларов США,и т. д.

В AccountController@show я делаю следующее:

 public function show($id)
    {
        $account = Account::findOrFail($id);
        //Get the transactions IDs
        $transaction_numbers = $account->transactions->map(function ($item,$key){
            //dump($item->id);
            return $item->transaction_number;
        });
        //$transaction_numbers = [1,2,3, ...];
        $transaction_numbers = $transaction_numbers->unique()->flatten();

        $balances=$transaction_numbers->map(function ($item,$key){           
            $total = Transaction::with('bill')->where('transaction_number',$item)->get()->reduce(function ($total, $item) {
                return $total + ($item->bill->name * $item->quantity);
            });
            //echo 'Tot: '.$total.'. Transaction ID: '.$item.'<br>';
            //THE PROBLEM COMES HERE
            return ['transaction_number'=>$item,'balance'=>$total];
        });

        //Now I want to add the date to the array and collection
$balances_array = $balances->toArray();
        $balances_tmp=[];
        foreach ($balances_array as $key=>$balance){
            //https://stackoverflow.com/a/46939910/1883256
            $date_time=DB::table('transactions')->where('transaction_number',$balance['transaction_number'])->take(1)->select('date_time')->pluck('date_time')->first();
            $balance['date_time']=$date_time;
            dump($balance);
            $balances_tmp[]=collect(['transaction_number'=>$balance['transaction_number'],'balance'=>$balance['balance'],'date_time'=>$date_time]);
        }
        //dd($balances_tmp);

        $balances = collect($balances_tmp);

        dd($balances);

        return view('accounts.account_show',[
            'account' => $account,
            'balances' => $balances,
        ]);
    }

Теперь, когда я пытаюсь в представлении выполнить итерацию и отобразить данные в таблицеПримерно так:

...
@foreach($balances as $balance)
                <tr>
                    <th scope="row">1</th>
                    <td>{{ $balance->transaction_number }}</td>
                    <td>{{ $balance->balance }}</td>
                @endforeach
...

Я получаю следующую ошибку:

Свойство [номер_транзакции] не существует в этом экземпляре коллекции.

Проблема Моя проблема в том, что когда я применяю функцию сбора к массиву, он на самом деле не преобразует все в коллекцию, а массив все еще остается!Я показываю вам полученный дамп:

Collection {#336 ▼
  #items: array:3 [▼
    0 => Collection {#276 ▼
      #items: array:3 [▼
        "transaction_id" => "1"
        "balance" => 122220
        "date" => "2019-07-02 19:52:22"
      ]
    }
    1 => Collection {#373 ▼
      #items: array:3 [▼
        "transaction_id" => "2"
        "balance" => 155350
        "date" => "2019-07-02 20:24:44"
      ]
    }
    2 => Collection {#272 ▼
      #items: array:3 [▼
        "transaction_id" => "3"
        "balance" => 113980
        "date" => "2019-07-02 20:27:25"
      ]
    }
  ]
}

Как видите, в коллекции все еще есть массивы, и поэтому я все еще получаю эту ошибку

В настоящее время я читая этот пост на форуме , который может относиться к моей проблеме.

Что мне тогда не хватает?

1 Ответ

1 голос
/ 12 июля 2019

Полагаю, вы изменили коллекцию как массив.в своем клинке вы также можете отлаживать, как это

@foreach($balances as $balance)
{{dd($balance)}}
@endforeach

, тогда я надеюсь, что вы должны использовать его, как показано ниже

 <td>{{ $balance['transaction_number'] }}</td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...