Я работаю над очень простым API с использованием laravel. У пользователей много задач, и задача принадлежит пользователю. Мой файл маршрутов выглядит следующим образом:
<?php
Route::resource('users', 'UsersController');
Route::get('users/{user_id}/tasks', 'UsersController@show_tasks');
Route::resource('tasks', 'TasksController');
Я хочу, чтобы второй маршрут получал все задачи, связанные с этим конкретным пользователем. Это просто. Я просто добавил отношение в моей модели User следующим образом:
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
переменная из первых рук. Я думал, что это должен быть объект коллекции, но когда я запустил его в моем REST-клиенте Postman, он завис из-за большого переполнения данных, я предполагаю, скриншот ниже:
Если кому-то интересно Acme::response
метод, я также включаю этот код:
public static function response($status = [], $messages = [], $data = [], $httpStatusCode){
return Response::json([
'status' => $status,
'messages' => $messages,
'data' => $data,
], $httpStatusCode);
}
Почему отношения не работают? Я был этим часами и до сих пор не могу понять, почему! Я предполагаю, что где-то совершаю очень глупую ошибку, но все равно не могу ее исправить!
Вы не должны использовать ()
Вот. Вместо:
$tasks = $user->tasks();
Вы получите свои задачи, используя:
$tasks = $user->tasks;
РЕДАКТИРОВАТЬ
Когда у вас есть отношения, и вы используете $user->tasks
это работает так, как вы бы использовали $user->tasks()->get()
так что мы можем сказать, что это ярлык.
Вы можете использовать паразиты, которые у вас есть, вы можете добавить больше условий, например, вы можете сделать что-то вроде этого:
$tasks = $user->tasks()->active()->get();
и определить область в вашем Task
модель:
function activeScope($q) {
return $q->where('status',1);
}
И теперь вы можете получать только активные задания для пользователя.
Других решений пока нет …