Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 28.05.2021 14:35:08

Фильтрация данных

Всем привет.
Подскажите пожалуйста бездарю) что сделать, чтоб все заработало:lol:
Пробую сделать фильтрацию по статье:
Все вроде работает, но могу понять как сделать, чтобы по выбору нескольких чекбоксов формировался запрос: posts?category=4,5
а не такой как у меня сейчас получается: posts?category=4&category=5

В шаблоне index.blade использую форму с чекбоксами и кнопкой:

<form action="{{ route('posts.index') }}">
    <input name="category" type="checkbox" value="4">Marketing
    <input name="category" type="checkbox" value="5">Make money
    <button type="submit">OK</button>
</form>

QueryFilter.php:

<?php

namespace App\Filters;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;

abstract class QueryFilter
{
    protected $request;

    protected $builder;

    protected $delimiter = ',';

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function filters()
    {
        return $this->request->query();
    }

    public function apply(Builder $builder)
    {
        $this->builder = $builder;

        foreach ($this->filters() as $name => $value) {
            if (method_exists($this, $name)) {
                call_user_func_array([$this, $name], array_filter([$value]));
            }
        }

        return $this->builder;
    }

    protected function paramToArray($param)
    {
        return explode($this->delimiter, $param);
    }
}

ProductFilter.php:

<?php

namespace App\Filters;

class ProductFilter extends QueryFilter
{
    public function category($id)
    {
        return $this->builder->whereIn('category_id', $this->paramToArray($id));
    }
}

Post.php:

public function scopeFilter(Builder $builder, QueryFilter $filters)
    {
        return $filters->apply($builder);
    }

PostController.php:

public function index(Request $request, ProductFilter $filters)
    {
       $posts = Post::with('category')->orderBy('id', 'desc')->filter($filters)->get();

       return view('admin.posts.index', compact('posts'));
    }

За ранее огромное спасибо! Прошу, сильно тухлыми помидорами не забрасывайте)

Не в сети

#2 28.05.2021 15:14:01

Re: Фильтрация данных

чтобы в адресной строке через запятую - такое только через javascript. но тебе должно быть пофигу как там выглядят параметры. лишь бы читались на стороне сервера. так вот, достаточно дополнить имя параметра квадратными скобками чтобы "множественный" параметр доходил весь — в виде массива

<input name="category[]" ...

request()->get('category') будет массивом значений


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 28.05.2021 15:17:15

Re: Фильтрация данных

Я так уже пробовал, но когда я ставлю category[] он выдает мне ошибку: explode() expects parameter 2 to be string, array given

Не в сети

#4 28.05.2021 16:44:39

Re: Фильтрация данных

Все, я разобрался))))
Функция paramToArray должна выглядеть так:

protected function paramToArray($param)
    {
        return explode($this->delimiter, implode($this->delimiter, $param));

    }

Не в сети

Подвал раздела