【发布时间】:2017-06-12 19:15:32
【问题描述】:
背景
我有两种方法来处理 Excel 电子表格的导入,清理字段(即将“player_name”更改为“name”),过滤掉无效的数据行和有效的数据行。如果有无效数据,则返回给 Vue 组件,让用户有机会更正无效数据。
初始提交由AdminImportPlayersController@store 处理,后续提交(修复无效数据)由AdminImportFixedPlayersController@store 处理。
数据在发布时被collect编辑到Collection。
问题
通过AdminImportPlayersController@store 处理的初始提交(实际上是导入excel 文件),我可以使用对象语法(即obj->prop)访问Collection 中的数据。但是,在AdminImportFixedPlayersController@store 控制器中使用基本相同的代码(仍然需要重构,可能会将功能体抽象为外观。)将“对象”视为array。显然它实际上是一个array,但我还没有弄清楚这是为什么..
控制器发布在下面。
代码
AdminImportPlayersController@store:
/**
* Imports players from an excel spreadsheet.
* Returns invalid players, if present.
*
* Teams are represented by their name in the submitted file.
*
* @param App\HttpRequests\StoreImportPlayersFormRequest $request
* @return Illuminate\Http\Response
*/
public function store(StoreImportPlayersFormRequest $request)
{
$now = Carbon::now()->toW3cString();
$fileName = 'players-import-' . $now . '.xls';
// moving imported file to local storage
$request->file('players')->move(storage_path('/import/excel/'), $fileName);
// creating a Collection from the results returned from file
$player_data = collect(Excel::load(storage_path('import/excel/') . $fileName)->get());
// clean up data structure
$player_data = $player_data->map(function ($player) {
$player['name'] = $player->player_name;
unset($player['player_name']);
return $player;
});
// get all invalid entries
$invalid_player_data = $player_data->filter(function ($player) {
\Log::info($player);
return ! Team::where('name', $player->team)->first() || $player->name == null;
})->values();
// get all valid entries
$valid_player_data = $player_data->filter(function ($player) {
return Team::where('name', $player->team)->first() && $player->name !== null;
})->values();
// save players
$valid_player_data->each(function ($player) {
$team = Team::where('name', $player->team)->first();
$team->players()->attach(
Player::create([
'name' => $player->name,
'temp' => 0,
])
);
});
return response()->json(['invalid_player_data' => $invalid_player_data->all()], 200);
}
AdminImportFixedPlayersController@store:
/**
* Stores fixed player data, after re-submission due to invalid data.
* Returns invalid players, if still present.
* Teams are represented by their id.
*
* @param App\Http\Requests\StoreImportFixedPlayersFormRequest $request
* @return Illuminate\Http\Response
*/
public function store(StoreImportFixedPlayersFormRequest $request)
{
$player_data = collect($request->players);
// get all invalid entries
$invalid_player_data = $player_data->filter(function ($player) {
return ! Team::where('id', $player['team'])->first() || $player['name'] == null;
})->values();
// get all valid entries
$valid_player_data = $player_data->filter(function ($player) {
return Team::where('id', $player['team'])->first() && $player['name'] !== null;
})->values();
// save players
$valid_player_data->each(function ($player) {
$team = Team::where('id', $player['team'])->first();
$team->players()->attach(
Player::create([
'name' => $player['name'],
'temp' => 0,
])
);
});
return response()->json(['invalid_player_data' => $invalid_player_data->all()], 200);
}
请注意,当说类似
return ! Team::where('id', $player->team)->first() || $player->name == null;
在AdminImportPlayersController(处理初始导入的控制器)中是合法的,不会抛出异常。
但是,相同的代码在AdminImportFixedPlayersController 中使用时会引发异常,我只能合法地使用以下语法:
return ! Team::where('id', $player['team'])->first() || $player['name'] == null;
抱歉问了这么长的问题,想详细点!
如果需要,请询问更多信息。
我已经在不同位置以两种方法注销了$player_data 的值。从请求中收集后,AdminImportFixedPlayersController 中的$player_data 的值等于:
[{"name": "ashley", "team" : 1}, ..., ...].
为什么不使用类似数组的语法就不能访问这些对象的属性?
【问题讨论】:
-
那么'AdminImportFixedPlayersController'控制器中的
$player_data是一个数组而不是一个集合对象? -
这是有道理的。但是,我认为将
$request->players放入Collection意味着我将处理Collection。也许数据包含在Collection中,但并非每组值都是Collection? -
另外,即使
array中的数据,我应该在迭代它时能够将对象作为对象访问,而不是数组。有什么建议吗?
标签: php arrays laravel object collections