gpt4 book ai didi

Laravel API resourceCollection 使用数组而不是模型

转载 作者:行者123 更新时间:2023-12-05 07:37:20 26 4
gpt4 key购买 nike

我有一个 API,它使用 API 资源和资源集合来正确格式化 JSON 响应。为了将我的 Controller 与我的模型分离,我使用适配器来查询底层模型。我想将适配器返回值作为数组传递,而不是 Eloquent 模型,以确保任何 future 的适配器在返回数据结构方面更容易正确。为了创建数组返回值,我使用 ->toArray() 序列化了我的适配器 Eloquent 结果。

我有 2 个 API 资源来正确格式化这些结果,对于我拥有的单个资源:

使用 Illuminate\Http\Resources\Json\Resource;

class Todo extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return $this->resource;
}
}

对于资源集合,我有:

使用 Illuminate\Http\Resources\Json\ResourceCollection;

class TodoCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => $this->collection
->map
->toArray($request)
->all()
];
}
}

当我从 Controller 返回单个资源时:

use App\Http\Resources\Todo;

public function show($id)
{
return new Todo($this->todoAdapter->findById($id));
}

适配器查询为:

public function findById(int $id){
return TodoModel::findOrFail($id)
->toArray();
}

这按预期工作。当我尝试传递一组模型集合时,问题就来了,即

public function index(Request $request)
{
$todos = $this->todoAdapter->getAllForUserId(Auth::id(), 'created_by', 'desc', self::DEFAULT_PAGINATE);
return new TodoCollection($todos);
}

适配器查询为:

public function getAllForUserId(int $userId, string $sortField, string $sortDir, int $pageSize = self::DEFAULT_PAGINATE)
{
return Todo::BelongsUser($userId)
->orderBy($sortField, $sortDir)
->paginate($pageSize)
->toArray();
}

我收到以下错误:

"message": "Call to a member function first() on array",
"exception": "Symfony\\Component\\Debug\\Exception\\FatalThrowableError",
"file": "/home/vagrant/code/public/umotif/vendor/laravel/framework/src/Illuminate/Http/Resources/CollectsResources.php",
"line": 24,

我猜我不能执行“new TodoCollection($todos)”,其中 $todos 是一组结果。我如何让我的 todoCollection 使用数组?任何建议将不胜感激!

最佳答案

您的 toArray 集合试图做太多事情:

$this->collection
->map
->toArray($request)
->all()

直接调用$this->collection->toArray()即可。

关于Laravel API resourceCollection 使用数组而不是模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48608325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com