Я хочу отфильтровать данные таблицы. У меня есть таблица штатов, одна для городов, другая для студентов.
- состояния (идентификатор, имя)
- города (id, name, state_id)
- студенты (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();
}
}
Обратите внимание, что отношения между таблицами полностью определены в моделях.