按 category_id 和语言环境 laravel 查询

Query by category_id and locale in laravel

我需要根据请求

查询所有文章 cateogry_id 和语言环境

示例:category_id 为 2 且区域设置为“en”的所有文章

    articles
      id
      language

   article_category
     article_id
     category_id

   categories
     id
     name

我试过的

  private function filterArticleByCategory(&$query, $category_id) {

        if (!is_null($category_id)) {
            $query = $query->whereIn('articles.id', Article::select('article_id')->from('article_category')->where('category_id', $category_id ));
        }
    }


    private function filterArticleByLanguage(&$query, $lang) {
        if(!is_null($lang)) {
//            $array = explode(' ', $lang);
            #arreyVal = array_values($array)[0]
            $query = $query->where('language', $lang);
        }
    }

您可以直接在您的控制器方法中创建一个方法:

class ArticleController {
    
    // ...
    
    public function getByCategoryAndLanguage(int $categoryId, string $language) {
        return Article::join('article_category', 'article.id', '=', 'article_category.article_id')
            ->where('category_id', '=', $categoryId)
            ->where('language', '=', $language)
            ->get();
    }
}

如果您需要在您的 Article 模型上直接使用这些过滤器,您可能需要使用 local scopes,尽管对于如此简单的 where 条件来说它可能是多余和多余的:

class Article extends Model {

    // ...

    public function scopeInCategory($query, int $categoryId) {
        return $query->join('article_category', 'article.id', '=', 'article_category.article_id')
            ->where('category_id', '=', $categoryId);
    }

    public function scopeInLanguage($query, string $language) {
        return $query->where('language', '=', $language);
    }
}

然后在你的控制器中:

class ArticleController {
    
    // ...
    
    public function getByCategoryAndLanguage(int $categoryId, string $language) {
        return Article::inCategory($categoryId)
            ->inLanguage($language)
            ->get();
    }
}

在您发表评论后进行编辑:

然后你可以在你的控制器上有两个不同的方法——每个过滤器一个——很容易:

class ArticleController {
    
    // ...
    
    public function getByCategory(int $categoryId) {
        return Article::join('article_category', 'article.id', '=', 'article_category.article_id')
            ->where('category_id', '=', $categoryId)
            ->get();
    }

    public function getByLanguage(string $language) {
        return Article::where('language', '=', $language)->get();
    }
}