【问题标题】:Can only access object properties with array syntax只能使用数组语法访问对象属性
【发布时间】: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


【解决方案1】:

当前解决方案

$request->players创建集合后

$player_data = collect($request->players);

我将每个Player 映射到它自己的Collection 和$player_data 中的每个Player,将每个Player 的属性设置为等于相关数据的值,作为普通数组访问:$player->name = $player['name']; .

解决办法:

   $player_data = collect($request->players);

    // turn each 'player' into a collection and create properties that are accessible via object->method notation
   $player_data = $player_data->map(function ($player) {
        $player = collect($player);
        $player->name = $player['name'];
        $player->team = $player['team'];
        return $player;
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多