# Lesson 5 ORM in Controller
[](https://hackmd.io/vyBIgyBQRIaBETNquA34gg)
###### tags: `Laravel` `ORM` `Controller`
---
## [pagination](https://laravel.com/docs/8.x/pagination)
### DB Builder
```php=
DB::table('users')->paginate(15);
```
### Model
```php=
User::paginate();
```
per_page default **15**
使用 **paginate** 會預設收 **page** 參數無須額外寫
----
### Appending To Pagination Links
```php=
$users->appends(['sort' => 'votes']);
```
or
```php=
$users->withQueryString();
```
----
### add other key
use Collection method **merge**
```php=
$custom = collect(['status' => Response::HTTP_OK]);
$data = $custom->merge($query->paginate($perPage)->withQueryString());
```
---
## parameter
```
example
https://dinner.test/api/meals?price=70&per_page=10&page=2`
```
```php=
$price = $request->input('price')
```
or
```php=
$price = $request->price
```
$price : 70
---
## search
### search Meal
```php=
public function index(Request $request)
{
$query = Meal::query();
if ($price = $request->input('price')) {
$query->where('price', $price);
}
if ($meal_name = $request->input('meal_name')) {
$query->where('meal_name', 'like', '%' . $meal_name . '%');
}
$perPage = $request->input('per_page') ?? 15;
return $query->paginate($perPage)->withQueryString();
}
```
---
## Generalizing API Response
### create a trait
```php=
// App\Traits\ApiResponser.php
<?php
namespace App\Traits;
trait ApiResponser
{
protected function successResponse($data, $code = 200, $message=null)
{
return response()->json([
'status'=> $code,
'message' => $message,
'data' => $data
], $code);
}
protected function errorResponse($code, $message = null)
{
return response()->json([
'status'=> $code,
'message' => $message,
'data' => null
], $code);
}
}
```
----
### use trait in controller
```php=
<?php
....
use App\Traits\ApiResponser;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests, ApiResponser;
}
```
----
### update response which in controller
before
```php=
return response()->json([
'status'=> Response::HTTP_OK,
'data' => $data
], Response::HTTP_OK);
```
after
```php=
return $this->successResponse($data);
```
---
## [Error Handling](https://laravel.com/docs/8.x/errors)
`app/Exceptions/Handler.php`
```php=
use App\Traits\ApiResponser;
class Handler extends ExceptionHandler
{
use ApiResponser;
........
/**
* @param Request $request
* @param Throwable $e
* @return JsonResponse|\Illuminate\Http\Response|Response|void
*/
public function render($request, Throwable $e)
{
return $this->handleException($request, $e);
}
public function handleException(Request $request, Throwable $e)
{
if ($e instanceof MethodNotAllowedHttpException) {
return $this->errorResponse(405, 'The specified method for the request is invalid');
}
if ($e instanceof NotFoundHttpException) {
return $this->errorResponse(404, 'The specified URL cannot be found', );
}
if ($e instanceof HttpException) {
return $this->errorResponse($e->getStatusCode(), $e->getMessage());
}
if (config('app.debug')) {
return parent::render($request, $e);
}
return $this->errorResponse(500, 'Unexpected Exception. Try later');
}
}
```
----
`GET http://127.0.0.1:8000/meals/4000`

[reference **Symfony\Component\HttpKernel\Exception**](https://github.com/symfony/symfony/tree/5.x/src/Symfony/Component/HttpKernel/Exception)
---
## 作業
- [ ] User 可以搜尋 `name` `mobile` `email` `status`,以及分頁功能 api
- [ ] Meal 可以搜尋 `price` `meal_name` 以及分頁功能 api
## 讀書報告
* [Blade-2/2](https://laravel.com/docs/8.x/blade#introduction)
{"metaMigratedAt":"2023-06-15T15:27:15.745Z","metaMigratedFrom":"Content","title":"Lesson 5 ORM in Controller","breaks":false,"contributors":"[{\"id\":\"8e42ec30-16dd-49e7-9493-42a2633bb31a\",\"add\":4457,\"del\":431}]"}