【问题标题】:Get relationship data from eloquent builder laravel 7从 eloquent builder laravel 7 获取关系数据
【发布时间】:2020-10-08 08:59:36
【问题描述】:

我想过滤我的表格数据。我有一个州表,一个城市表,一个学生表。

  1. 状态(ID,名称)
  2. 城市(id、name、state_id)
  3. 学生(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


    【解决方案1】:

    我找到了解决办法。

    我们可以用 eloquent builder 做到这一点:

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

    Link to source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2021-12-07
      • 2017-05-01
      • 1970-01-01
      • 2020-11-26
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多