Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ChangesModelOrder
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 1
 changeOrder
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3namespace App\Traits\Controllers;
4
5use App\Http\Requests\Bo\UpdateChangeOrderRequest;
6use Illuminate\Database\Eloquent\Model;
7use Illuminate\Support\Facades\DB;
8use Illuminate\Support\Facades\Session;
9use Illuminate\Support\Str;
10
11trait ChangesModelOrder
12{
13    /**
14     * Change order.
15     *
16     * @param \App\Http\Requests\Bo\UpdateChangeOrderRequest $request
17     * @param \Illuminate\Database\Eloquent\Model            $model
18     * @return \Illuminate\Http\RedirectResponse
19     * @throws \RuntimeException Si le nom du parametre de la route ne correspond pas au model utilisé.
20     */
21    public function changeOrder(UpdateChangeOrderRequest $request, Model $model): \Illuminate\Http\RedirectResponse
22    {
23        $params    = collect(request()->route()->parameterNames);
24        $className = Str::ucfirst(Str::lower($params->get($params->count() - 2)));
25        $className = "\\App\\Models\\$className";
26
27        if (!class_exists($className)) {
28            throw new \RuntimeException("The $className class doesn't exist.");
29        }
30
31        /** @var \Illuminate\Database\Eloquent\Model|null */
32        $model = $className::where($model->getRouteKeyName(), $model->getRouteKey())->first();
33
34        if (!$model) {
35            return back()->with('error', trans('crud.messages.order_not_changed'));
36        }
37
38        return DB::transaction(function () use ($request, $className, $model) {
39            /** @var \Illuminate\Database\Eloquent\Model|null */
40            $tmp = $className::where('order', $request->direction ? '<' : '>', $model->order)
41                ->orderBy('order', $request->direction ? 'DESC' : 'ASC')->first();
42
43            if (!$tmp) {
44                return back()->with('error', trans('crud.messages.order_not_changed'));
45            }
46
47            $newOrder     = $tmp->order;
48            $tmp->order   = $model->order;
49            $model->order = $newOrder;
50            $tmp->saveOrFail();
51            $model->saveOrFail();
52            Session::flash('success', trans('crud.messages.order_changed'));
53
54            return back();
55        });
56    }
57}