Получите данные о взаимоотношениях от красноречивого строителя laravel 7 - PullRequest
1 голос
/ 18 июня 2020

Я хочу отфильтровать данные таблицы. У меня есть таблица штатов, одна для городов и одна для студентов.

  1. состояния (id, name)
  2. города (id, name, state_id)
  3. студенты (id, first_name, last_name, city_id)

Когда я хочу отфильтровать данные с помощью красноречивого построителя, как я могу получить доступ к отношениям для фильтра состояния обработки.

<?php

namespace App\StudentSearch\Filters;

use Illuminate\Database\Eloquent\Builder;

class StateId implements Filter
{
    /**
     * @inheritDoc
     */
    public static function apply(Builder $builder, $value)
    {
        // something like this
        return $builder->where('state_id', $value);
    }
}

StudentSearch. php

<?php

namespace App\StudentSearch;

use App\Student;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Str;

class StudentSearch
{
    public static function apply(Request $filters)
    {
        $query = static::applyDecoratorsFromRequest($filters, (new Student)->newQuery());

        return static::getResults($query);
    }


    private static function applyDecoratorsFromRequest(Request $request, Builder $query)
    {
        foreach ($request->all() as $filterName => $value) {

            $decorator = static::createFilterDecorator($filterName);

            if (static::isValidDecorator($decorator)) {
                $query = $decorator::apply($query, $value);
            }

        }
        return $query;
    }
    private static function createFilterDecorator($name)
    {
        return __NAMESPACE__ . '\\Filters\\' . Str::studly($name);
    }

    private static function isValidDecorator($decorator)
    {
        return class_exists($decorator);
    }

    private static function getResults(Builder $query)
    {
        return $query->get();
    }
}

Обратите внимание, что отношения между таблицами полностью определены в моделях.

1 Ответ

0 голосов
/ 19 июня 2020

Я нашел решение.

Мы можем сделать это с помощью красноречивого построителя:

$builder->whereHas('relationName', function($query) use($value) {
    $query->where('state_id', $value);
});

Ссылка на источник

...