Laravel模型中实现多语言数据自动过滤:重写newQuery()方法

admin 百科 17

Laravel模型中实现多语言数据自动过滤:重写newQuery()方法

本教程详细介绍在laravel多语言应用中,如何通过重写模型(model)的`newquery()`方法,实现数据查询时自动根据当前应用语言环境进行过滤。这种方法提供了一种优雅且dry(don't repeat yourself)的解决方案,避免了在每次数据查询时手动添加语言条件,确保了所有通过该模型进行的查询都能自动包含语言过滤逻辑,从而简化多语言数据管理。

引言:多语言应用的查询挑战

在构建多语言网站时,通常会在数据库的每个相关数据表中添加一个 language 字段,用于区分不同语言版本的数据。例如,一个产品表可能包含英文、中文等不同语言的产品描述。当用户访问网站时,系统需要根据当前的语言环境(例如 App::getLocale())来检索对应语言的数据。

然而,在Laravel中,这意味着每次从模型查询数据时,我们都可能需要手动添加一个 where('language', App::getLocale()) 条件。这种重复性的操作不仅繁琐,而且容易遗漏,导致代码冗余且难以维护。虽然Laravel的“全局作用域”(Global Scopes)可以解决这个问题,但对于那些几乎总是需要语言过滤的模型,可能存在一种更底层、更直接的实现方式,即重写模型的 newQuery() 方法。

理解 newQuery() 方法

newQuery() 方法是Laravel Eloquent模型的核心组成部分之一。它负责在每次需要创建一个新的查询构建器实例时被调用。无论你是使用 Model::all()、Model::find(1)、Model::where('column', 'value') 还是 Model::query()->...,最终都会通过 newQuery() 方法来获取一个基础的查询构建器。

通过重写这个方法,我们可以在查询构建器被返回给调用者之前,注入我们自定义的默认查询条件。这意味着任何从该模型发起的查询,都将自动包含我们预设的条件,从而实现全局性的行为修改。

Laravel模型中实现多语言数据自动过滤:重写newQuery()方法-第2张图片-佛山资讯网

实现自动语言过滤

要为特定的模型实现自动的语言过滤,只需在该模型类中重写 newQuery() 方法,并在其中添加语言过滤条件。

假设我们有一个 Product 模型,并且其对应的数据表包含一个 language 字段。我们希望所有对 Product 模型的查询都自动过滤出当前语言的产品。

示例代码:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\App; // 引入 App Facade

class Product extends Model
{
    /**
     * Get a new query builder for the model's table.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function newQuery(): Builder
    {
        // 调用父类的 newQuery() 方法获取原始查询构建器
        return parent::newQuery()->where('language', App::getLocale());
    }

    // ... 模型的其他属性和方法 ...
}

登录后复制

代码解释:

标签: php laravel go cad app 多语言 作用域

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~