从 eloquent 生成器 laravel 7 获取关系数据
Get relationship data from eloquent builder laravel 7
我想过滤我的 table 数据。我有一个 table 用于州,一个用于城市,一个用于学生。
- 州(身份证,姓名)
- 城市(id,名称,state_id)
- 学生(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);
});
我想过滤我的 table 数据。我有一个 table 用于州,一个用于城市,一个用于学生。
- 州(身份证,姓名)
- 城市(id,名称,state_id)
- 学生(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);
});