无法通过使用collect()函数将关联数组转换为Laravel中的完整集合

时间:2019-07-12 03:38:49

标签: laravel collections

我正在使用Laravel构建货币库存网络应用。

我在users中组织了表,其中用户可能有很多accounts,这是通过account_user表进行的多对多关系。每个帐户都有transactions的记录。一个帐户有很多交易。

transactions表中,我存储了帐单和数量。因此, transactions 表具有以下列:

  • account_id
  • bill_id
  • 日期时间
  • transaction_number
  • 数量

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
...

我收到以下错误:

  

此集合实例上不存在属性[transaction_number]。

问题 我的问题是,当我将collect函数应用于数组时,它实际上并没有将所有内容都转换为collection,仍然剩下数组!我向您展示了产生的转储:

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

如您所见,集合中仍然有数组,这就是为什么我仍然遇到该错误的原因

我目前reading this post of a forum可能与我的问题有关。

那我想念什么?

1 个答案:

答案 0 :(得分:1)

我想您已将集合更改为数组。在刀片中,您也可以像这样

进行调试
@foreach($balances as $balance)
{{dd($balance)}}
@endforeach

那么我希望您必须像下面那样使用它

 <td>{{ $balance['transaction_number'] }}</td>