带有数据透视表和 where 条件的 Laravel 查询生成器

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

我有 2 个表 - 视频和类别。 还有一个数据透视表 Video_Category,因为类别可以包含更多视频。

我尝试从数据透视表中获取所有 ID:

$allcategoryvideos = CategoryVideo::where('category_id', $category_id)->pluck('video_id');

但是我想用 where('featured', 1) 过滤所有视频(视频表),所以我使用 foreach 并尝试获取所有视频:

  $featured = [];
            
            foreach ($allcategoryvideos as $video){
                array_push($featured, [
                    $video = Video::where('id', $video)->whereNotNull('featured')->first(),
                    
                ]);
                
            }
            return $featured;

并且在模型 CategoryVideo 枢轴处具有以下关系:

public function videofeatured() {
       return $this->hasOne(Video::class, 'id', 'video_id')->where('featured', 1);
        
       
    } 

所以,它几乎可以工作,但是如果第一行的 pluck() 有 2 个以上记录并且所有记录都没有特色,它会在数组中给我空索引,如下所示:

[[{"id":1,"created_at":"2022-07-24T14:20:30.000000Z","updated_at":"2022-07-24T14:20:34.000000Z","name":"Video 1","slug":"video","description":"123","video_link":"123","mp3_link":"123","image_url":"123","minutes":10,"sort_id":null,"featured":1,"is_visible":1}],[null]]

我需要帮助来解决此问题或创建一些查询,获取属于特定类别的所有视频,并过滤特定视频(如果其有特色)并将其粘贴到没有空索引的数组中。 非常感谢您的帮助。

php laravel eloquent
1个回答
1
投票

你可以做出这个逻辑

Video::where('featured', 1)->whereHas('categories', function ($q)use($category_id) {
        $q->where('categories.id', $category_id);
    })->get();

在视频模型中你应该这样做

public function categories() {
    return $this->belongsToMany(Category::class, 'category_video');
}

您也可以像这样与数据透视表建立关系

public function category_video() {
    return $this->hasMany(CategoryVideo::class);
}

并进行更多预定义查询

    Video::where('featured', 1)->whereHas('category_video', function ($q)use($category_id) {
        $q->where('category_video.category_id', $category_id);
    })->get();
© www.soinside.com 2019 - 2024. All rights reserved.