从 eloquent builder laravel 7 获取关系数据

Posted

技术标签:

【中文标题】从 eloquent builder laravel 7 获取关系数据【英文标题】:Get relationship data from eloquent builder laravel 7 【发布时间】: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();
    

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

【问题讨论】:

【参考方案1】:

我找到了解决办法。

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

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

Link to source

【讨论】:

以上是关于从 eloquent builder laravel 7 获取关系数据的主要内容,如果未能解决你的问题,请参考以下文章

laraver6-数据填充

调用未定义的方法 Illuminate\Database\Eloquent\Builder::getAbsolutePath() [重复]

调用未定义的方法 Illuminate\Database\Eloquent\Builder::mapInto()

laravel Builder scope count() 出错 Eloquent/Builder.php 1185行

Laravel:在“query-builder”或“eloquent”中更改原始查询

Laravel Eloquent builder 查询日志