Laravel-过滤查询

问题描述 投票:0回答:2

[嗨,我主要来自Symfony背景,我想在项目中使用laravel,我想创建一个端点,该端点过滤并搜索Film模型,并返回与所选过滤器选项匹配的电影集,这些电影将为[C0 ]由用户选择。

过滤器输入

类别表具有2列Categories, Location and Age Ratingmain,其中每个列都有种子数据列表。

年龄等级表有1列sub,其中包含种子数据列表

[位置表具有2列agecountry,每列都有种子数据

对于每个不同的滤镜,它应该根据用户为每一列选择的选项来搜索并返回电影。例如,选择一个主类别作为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
mysql laravel eloquent doctrine
2个回答
0
投票

您可以使用 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


0
投票

要达到目标,您可以使用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()的混合物:

© www.soinside.com 2019 - 2024. All rights reserved.