when(!$type->equals(AdviceTypeEnum::all), fn (Builder $q) => $q->where('type', $type)); /** @var string|null $search Search field */ $search = $request->input('search'); if ($search) { $this->searchQuery( $adviceModels, $search, null, 'title' ); } $searchFields = trans('Titre'); /** Sort columns with a query */ $this->sortQuery($adviceModels); /** Custom pagination */ $adviceModels = $this->paginate($adviceModels); return view('bo.pages.advice.index', [ 'adviceModels' => $adviceModels, 'currentType' => $type, 'search' => $search, 'searchFields' => $searchFields ]); } /** * Show the form for creating a new resource. * * @param \App\Enums\Advices\AdviceTypeEnum $type * @return \Illuminate\Contracts\View\View */ public function create(AdviceTypeEnum $type): \Illuminate\Contracts\View\View { $advice = new Advice(); $adviceTags = Tag::query()->where('type', TagTypeEnum::recipes)->select(['id', 'label', 'slug'])->get(); $adviceProducts = Product::all(); $recipeList = Advice::query()->where('type', '=', AdviceTypeEnum::recipes)->get(); $tipList = Advice::query()->where('type', '=', AdviceTypeEnum::tips)->get(); $recipesSelected = collect(); $tipsSelected = collect(); collect($advice->advices) // @phpstan-ignore-next-line ->each(function (Advice $eltAdvice) use (&$recipesSelected, &$tipsSelected) { if ($eltAdvice->type->equals(AdviceTypeEnum::recipes)) { $recipesSelected = $recipesSelected->concat([$eltAdvice]); } elseif ($eltAdvice->type->equals(AdviceTypeEnum::tips)) { $tipsSelected = $tipsSelected->concat([$eltAdvice]); } }); return view('bo.pages.advice.create', [ 'adviceModel' => $advice, 'currentType' => $type, 'adviceTags' => $adviceTags, 'adviceProducts' => $adviceProducts, 'recipeList' => $recipeList, 'tipList' => $tipList, 'recipesSelected' => $recipesSelected, 'tipsSelected' => $tipsSelected, ]); } /** * Store a newly created resource in storage. * * @param \App\Http\Requests\Bo\Advice\StoreAdviceRequest $request * @return \Illuminate\Http\RedirectResponse */ public function store(StoreAdviceRequest $request): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request) { $advice = new Advice(); $advice->fill(Arr::except($request->validated(), [ 'tags', 'products', 'associated_tips_list', 'associated_recipes_list', ])); $currentType = AdviceTypeEnum::make(\intval($request->type)); if ($advice->saveOrFail()) { $advice->tags()->sync(collect($request->input('tags'))->pluck('id')); $advice->products()->sync($request->input('products_list')); $advice->advices()->sync(array_merge($request->input('recipes_list'), $request->input('tips_list'))); return redirect() ->route('bo.advice.edit', $advice) ->with('success', __( 'crud.messages.has_been_created', ['model' => Str::singular($currentType->label())] )); } return redirect() ->back() ->with('error', __( 'crud.messages.cannot_be_created', ['model' => Str::singular($currentType->label())] )); }); } /** * Show the form for editing the specified resource. * * @param \App\Models\Advice $advice * @return \Illuminate\Contracts\View\View */ public function edit(Advice $advice): \Illuminate\Contracts\View\View { $currentType = $advice->type; $adviceTags = Tag::query()->where('type', TagTypeEnum::recipes) ->select(['id', 'label', 'slug'])->get(); $adviceProducts = Product::all(); $recipeList = Advice::query()->where([ ['type', '=', AdviceTypeEnum::recipes], ['id', '!=', $advice->id], ])->get(); $tipList = Advice::query()->where([ ['type', '=', AdviceTypeEnum::tips], ['id', '!=', $advice->id], ])->get(); return view('bo.pages.advice.edit', [ 'adviceModel' => $advice, 'currentType' => $currentType, 'adviceTags' => $adviceTags, 'adviceProducts' => $adviceProducts, 'recipeList' => $recipeList, 'tipList' => $tipList, 'recipesSelected' => $advice->recipes, 'tipsSelected' => $advice->tips, ]); } /** * Update the specified resource in storage. * * @param \App\Http\Requests\Bo\Advice\UpdateAdviceRequest $request * @param \App\Models\Advice $advice * @return \Illuminate\Http\RedirectResponse */ public function update(UpdateAdviceRequest $request, Advice $advice): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request, $advice) { $advice->tags()->sync(collect($request->input('tags'))->pluck('id')); $advice->products()->sync($request->input('products_list')); $advice->advices()->sync(array_merge($request->input('recipes_list'), $request->input('tips_list'))); $advice->fill(Arr::except($request->validated(), [ 'tags', 'products', 'associated_tips_list', 'associated_recipes_list', ])); $currentType = AdviceTypeEnum::make(\intval($request->type)); if ($advice->saveOrFail()) { return redirect() ->route('bo.advice.edit', $advice) ->with('success', trans( 'crud.messages.has_been_updated', ['model' => Str::singular($currentType->label())] )); } return redirect() ->back() ->with('error', trans( 'crud.messages.cannot_be_updated', ['model' => Str::singular($currentType->label())] )); }); } /** * Remove the specified resource from storage. * * @param \App\Models\Advice $advice * @return \Illuminate\Http\RedirectResponse */ public function destroy(Advice $advice): \Illuminate\Http\RedirectResponse { DB::table('advice_advice')->where($advice->advices()->getRelatedPivotKeyName(), $advice->id)->delete(); $advice->tags()->sync([]); $advice->products()->sync([]); $advice->advices()->sync([]); $currentType = AdviceTypeEnum::make(\intval($advice->type->value())); if ($advice->deleteOrFail()) { return redirect() ->route('bo.advice.index', ['type' => $currentType]) ->with('warning', trans( 'crud.messages.has_been_deleted', ['model' => Str::singular($currentType->label())] )); } return redirect() ->back() ->with('error', trans( 'crud.messages.cannot_be_deleted', ['model' => Str::singular($currentType->label())] )); } }