我正在使用laravel开发一个非常简单的API。用户有许多任务,任务属于用户。我的路线文件如下:
<?php
Route::resource('users', 'UsersController');
Route::get('users/{user_id}/tasks', 'UsersController@show_tasks');
Route::resource('tasks', 'TasksController');
我希望第二条路线获得与该特定用户相关的所有任务。很简单。我刚刚在我的用户模型中添加了一个关系,如下所示:
public function tasks(){
return $this->hasMany('Task');
}
show_tasks
中的UsersController
方法如下:
public function show_tasks($id){
if(!$user = $this->user->find($id)){
return Acme::response('error', 'Resource not found.', [], 404);
}
$tasks = $user->tasks();
dd($tasks);
return Acme::response('success', [], $tasks, 200);
}
我已经放置了dd方法,因为响应返回了一个空数组,我希望第一手看到$tasks
变量中的内容。我认为它必须是一个集合对象但是当我在Postman REST客户端中运行它时,由于我假设的大数据溢出而挂起,截图如下:
如果有人对Acme::response
方法感到好奇,我也会包含该代码:
public static function response($status = [], $messages = [], $data = [], $httpStatusCode){
return Response::json([
'status' => $status,
'messages' => $messages,
'data' => $data,
], $httpStatusCode);
}
为什么这段关系不起作用?我已经这几个小时,仍然无法弄清楚为什么!我猜我可能在某个地方做了一个非常愚蠢的错误,但无论如何都无法达到它!
答案 0 :(得分:2)
你不应该在这里使用()
。而不是:
$tasks = $user->tasks();
您将使用以下方式完成任务:
$tasks = $user->tasks;
修改强>
如果您有关系并且使用$user->tasks
,那么它就像使用$user->tasks()->get()
一样有效,因此我们可以说它是一种捷径。
你可以使用你得到关系的parantheses,你可以添加更多的条件,例如你可以这样做:
$tasks = $user->tasks()->active()->get();
并在Task
模型中定义范围:
function activeScope($q) {
return $q->where('status',1);
}
现在,您只能为用户获取活动任务。