【发布时间】:2020-10-08 08:59:36
【问题描述】:
我想过滤我的表格数据。我有一个州表,一个城市表,一个学生表。
- 状态(ID,名称)
- 城市(id、name、state_id)
- 学生(id、first_name、last_name、city_id)
当我想使用 eloquent builder 过滤数据时,如何访问句柄状态过滤器的关系。
<?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();
}
}
请注意,表之间的关系完全在模型中定义。
【问题讨论】:
标签: php laravel eloquent laravel-7 eloquent-relationship