[嗨,我主要来自Symfony背景,我想在项目中使用laravel,我想创建一个端点,该端点过滤并搜索Film
模型,并返回与所选过滤器选项匹配的电影集,这些电影将为[C0 ]由用户选择。
过滤器输入
类别表具有2列Categories, Location and Age Rating
和main
,其中每个列都有种子数据列表。
年龄等级表有1列sub
,其中包含种子数据列表
[位置表具有2列age
和country
,每列都有种子数据
对于每个不同的滤镜,它应该根据用户为每一列选择的选项来搜索并返回电影。例如,选择一个主类别作为city
,将一个子类别作为Arts
,则它应该只返回带有类别的电影
我创建了一个查询,查询如何最初以symfony的方式联接表(希望它是正确的),但不确定如何将其调整为更Laravel或雄辩,我的主要思想是拥有一个包含过滤方法的存储库生病给你看我有什么代码的例子。
电影型号
drawing
电影桌
/**
* one-to-many (inverse)
*/
public function location(): BelongsTo
{
return $this->belongsTo(Location::class);
}
public function categories(): BelongsToMany
{
return $this->belongsToMany(
Category::class,
'film_categories',
'film_id',
'category_id'
);
}
public function ageRatings(): BelongsToMany
{
return $this->belongsToMany(
AgeRating::class,
'film_age_ratings',
'film_id',
'age_rating_id'
);
}
Schema::create('film', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->integer('location_id);
$table->string('name')->nullable();
$table->timestamps();
});
(数据透视表)
film_categories
类别表
Schema::create('film_categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('category_id');
$table->uuid('film_id');
$table->timestamps();
});
film_age_ratings表(数据透视表)
Schema::create('categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('main');
$table->string('sub');
});
年龄等级表
Schema::create('film_age_ratings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->uuid('film_id');
});
查询原则
Schema::create('age_ratings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('age');
});
我将如何在laravel中编写此查询?这是我的尝试示例存储库功能
Select *
From films f
Join film_categories fc on f.id = fc.film_id
Join categories c on c.id = fc.category_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
您可以使用 public function filterFilms()
{
$films = Film::from('films')
->join('film_categories', 'film_categories.film_id', '=', 'films.id')
->join('categories', 'categories.id', '=', 'film_categories.category_id')
->join('film_age_ratings', 'film_age_ratings.age_rating_id', '=', 'age_ratings.id')
->join('age_ratings', 'age_ratings.id', '=', 'film_age_ratings.age_rating_id')
->join('location', 'location.id', 'films.location_id')
->orderBy('updated_at', 'desc')
->get('films.*');
return $films;
}
方法,如文档所示:whereHas
要达到目标,您可以使用use Illuminate\Database\Eloquent\Builder;
//...
$categoryIds = [/* Category ids to filter by */];
$films = Film::whereHas('categories', function (Builder $query) use ($categoryIds) {
$query->whereIn('categories.id', $categoryIds);
})->get();
和when()的混合物: