【问题标题】:Display DB Entries in json Array in Controller (Laravel / PHP)在控制器中显示 json 数组中的数据库条目(Laravel / PHP)
【发布时间】:2020-01-23 11:57:59
【问题描述】:

我正在尝试在我的 PlayerController 中编写一个索引函数,因此我的 Vue 组件能够以这种形式创建一个包含 userId、userName、userVote 的数组:[{userId:1, userName:Jimmy,userVote:7}, {}...]

我有一个 Players 表和 Session 表,因为我的 Player.userSession 和 Session.sessionId 具有相同的属性,我正在使用 Laravel 的请求来获取此信息,使用具有 Session 的 ID 的其他类创建一个变量并获取所有用户谁是房间的一部分。

所有内容都应该保存并返回。

这是我目前的代码:

 public function index(Request $request)
    {


        $room = $request->input('sessionId');

        $currentPlayers = Player::where('userSession', $room)->get();

        $userId = $currentPlayers->userId;
        $userName = $currentPlayers->userName;
        $userVote = $currentPlayers->userVote;


        return json_encode([
        'userId' => $userId,
        'userName' => $userName,
        'userVote' => $userVote]);

    }

但现在它说:“此集合实例上不存在属性 [userId]。”

https://pasteboard.co/IyJyUZ0.png https://pasteboard.co/IyJypj5.png

【问题讨论】:

  • ->get(); 返回一个行集合,你的意思是->first();?或者,您可以遍历集合,然后单独操作每个集合。
  • 是的,使用 ->first() 确实有效 我已经尝试过,但我需要的不仅仅是一条记录……我怎样才能循环获得我的结果?
  • 使用标准的foreach

标签: php json database laravel


【解决方案1】:

您正在尝试从集合对象中检索模型属性。抛出错误是因为该集合不包含 userId 属性。你必须迭代数据才能得到它。

但这不是您想要实现的目标。您想要一个仅包含这些字段的 json 响应。因此,首先您必须更改查询或映射您的集合以仅选择这些字段...由于您需要 JSON 响应,因此实现目标的最简单方法是使用 Api resources

所以你声明你的资源:

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Player extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'userId' => $this->userId,
            'userName' => $this->userName,
            'userVote' => $this->userVote,
        ];
    }
}

并将此资源作为集合从您的控制器返回:

<?php

namespace App\Http\Controllers;

use App\Http\Resources\PlayerResource;
// [...]

public function index(Request $request)
{

    $room = $request->input('sessionId');

    $currentPlayers = Player::where('userSession', $room)->get();

    return PlayerResource::collection($currentPlayers);

}

Laravel 会为你将结果编码为 json 格式。

【讨论】:

  • 好的,我创建了一个资源,现在我的 App\Controller\Resources 文件夹中有一个 Players.php...我必须在开头声明什么才能使用“返回 PlayerResource: :collection($currentPlayers); "?
  • use App\Controller\Resources\PayerResource,我将编辑示例,以便您获得完整的答案
  • 好的,我成功添加了所有内容,现在我的错误是:“未定义的属性:Illuminate\Database\Query\Builder::$sessionId”[注释 sessionid、用户名或 userVote 时相同]
  • 我在您的查询代码中没有看到$sessionId 变量...这个问题与我为帮助您而编写的代码无关。
  • 好吧 laravel 强调这是一个问题 bropublic function __get($key) { return $this-&gt;resource-&gt;{$key}; }
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 2013-03-28
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
相关资源
最近更新 更多