从 eloquent 生成器 laravel 7 获取关系数据

Get relationship data from eloquent builder laravel 7

我想过滤我的 table 数据。我有一个 table 用于州,一个用于城市,一个用于学生。

  1. 州(身份证,姓名)
  2. 城市(id,名称,state_id)
  3. 学生(id, first_name, last_name, city_id)

当我想使用 eloquent 构建器过滤数据时,我如何访问句柄状态过滤器的关系。

<?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();
    }
}

请注意 table 之间的关系完全在模型中定义。

我找到了解决方案。

我们可以使用 eloquent 构建器来做到这一点:

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

Link to source