gpt4 book ai didi

mysql - 过滤 Eloquent

转载 作者:行者123 更新时间:2023-11-29 09:25:20 25 4
gpt4 key购买 nike

我在一个项目中使用 Laravel,我想创建一个端点来过滤和搜索 Film 模型,并返回与所选过滤器选项匹配的电影集合,这些选项将是 Options,用户选择的位置和年龄分级

我创建了一个查询,询问我最初如何在 symfony 中连接表(希望它是正确的),但我不确定如何调整它以使其更加 Laravel 或更 Eloquent 。

电影模型

    public function location(): BelongsTo
{
return $this->belongsTo(Location::class);
}

public function options(): BelongsToMany
{
return $this->belongsToMany(
Option::class,
'film_options',
'film_id',
'option_id'
);
}

public function ageRatings(): BelongsToMany
{
return $this->belongsToMany(
AgeRating::class,
'film_age_ratings',
'film_id',
'age_rating_id'
);
}

Doctrine 中的查询

Select *
From films f
Join film_options fo on f.id = fo.film_id
Join options o on o.id = fo.option_id
Join film_age_ratings fa on f.id = fa.film_id
Join age_ratings a on a.id = fa.age_rating_id
Join location l on l.id = p.location_id

我如何在 Laravel 中编写这个查询?

最佳答案

要实现您的目标,您可以混合使用 when()whereHas() :

$films = Film
::when($request->input('first'), function ($query, $first) {
$query->whereHas('options', function ($query) use ($first) {
$query->where('first', $first);
});
})
->when($request->input('second'), function ($query, $second) {
$query->whereHas('options', function ($query) use ($second) {
$query->where('second', $second);
});
})
->when($request->input('age'), function ($query, $age) {
$query->whereHas('ageRatings', function ($query) use ($age) {
$query->where('age', $age);
});
})
->when($request->input('country'), function ($query, $country) {
$query->whereHas('locations', function ($query) use ($country) {
$query->where('country', $country);
});
})
->when($request->input('city'), function ($query, $city) {
$query->whereHas('locations', function ($query) use ($city) {
$query->where('city', $city);
});
})
->orderBy('updated_at', 'desc')
->get();

本质上,上面的操作是说,当您提交非空值时,它会向该关系的查询添加一个 where 子句
例如提交 main 时,当 main 是提交的值时,它将限制电影仅具有类别。

<小时/>

另外,仅供引用,使用 Eloquent 时不需要添加 from(...) 方法。

<小时/>

限制行数的一个简单方法是添加 scopes到您的Film模型,例如

在您的Film模型中:

public function scopeHasMain($query, $main)
{
$query->whereHas('options', function ($query) use($first) {
$query->where('first', $first);
});
}

那么你的 when() 方法将是:

when($request->input('first'), function ($query, $first) {
$query->hasFirst($first);
})

关于mysql - 过滤 Eloquent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59695291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com