全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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() 方法来获取一个基础的查询构建器。

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

实现自动语言过滤

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

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

示例代码:

where('language', App::getLocale());
    }

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

代码解释:

  1. parent::newQuery(): 这是关键一步。我们首先调用父类 Model 的 newQuery() 方法,以获取一个未经修改的、基础的查询构建器实例。这是为了确保我们不会破坏Eloquent模型原有的查询初始化逻辑。
  2. ->where('language', App::getLocale()): 在获取到基础查询构建器之后,我们链式调用 where() 方法,添加语言过滤条件。
    • 'language':这是你数据库表中用于存储语言信息的字段名。
    • App::getLocale():这是一个Laravel辅助函数,用于获取当前应用的语言环境。它会返回一个字符串,例如 'en'、'zh' 等。

工作原理与优势

一旦你在模型中重写了 newQuery() 方法,所有通过该模型进行的查询都将自动包含 where('language', App::getLocale()) 条件。

例如:

// 这将只返回当前语言的产品
$products = Product::all();

// 这也将只返回当前语言中 ID 为 1 的产品
$product = Product::find(1);

// 这会返回当前语言中 category_id 为 5 的所有产品
$categoryProducts = Product::where('category_id', 5)->get();

这种方法的优势在于:

  • DRY (Don't Repeat Yourself): 无需在每次查询时手动添加语言条件,减少了重复代码。
  • 集中管理: 语言过滤逻辑被集中封装在模型内部,易于维护和修改。
  • 透明性: 对于调用者而言,查询代码保持简洁,无需关心底层的语言过滤细节。
  • 底层实现: 作为模型创建查询的入口,这种方式非常基础和可靠。

注意事项与高级用法

尽管重写 newQuery() 方法非常强大,但也有一些需要考虑的场景和潜在问题:

  1. 绕过自动过滤: 如果某些情况下,你需要查询所有语言的数据(例如,在后台管理界面),而不想应用语言过滤,那么直接重写 newQuery() 会带来不便。此时,你可以考虑以下几种策略:

    • 使用全局作用域的 withoutGlobalScopes(): 如果你将语言过滤实现为全局作用域,可以使用 Product::withoutGlobalScopes()->get() 来绕过。
    • 自定义方法: 在模型中添加一个自定义方法来获取未过滤的查询构建器:
      public function newQueryWithoutLanguageFilter(): Builder
      {
          return parent::newQuery();
      }
      // 使用:Product::newQueryWithoutLanguageFilter()->get();
    • 条件判断: 在 newQuery() 内部添加条件判断,例如基于某个配置或请求参数来决定是否添加语言过滤。但这会使 newQuery() 变得复杂。
  2. 性能影响: 对于简单的 WHERE 条件,通常对数据库查询性能影响甚微。数据库索引(如果 language 字段有索引)会进一步优化查询速度。

  3. 适用场景: 此方法最适用于那些绝大多数情况下都需要进行语言过滤的模型。如果一个模型在很多场景下都需要在有语言过滤和无语言过滤之间切换,那么全局作用域(Global Scopes)可能提供更大的灵活性,因为它们可以更容易地被启用或禁用。

  4. 与全局作用域的比较:

    • newQuery() 重写: 更底层,直接修改了查询构建器的初始化过程。一旦设置,所有通过该模型创建的查询都受影响。
    • 全局作用域: 也是一种自动应用查询条件的方式,但它更像是一个“插件”,可以更容易地被移除(withoutGlobalScopes())。它通常被认为是更“Laravel惯用”的方式来处理这类问题。
    • 选择哪种方式取决于个人偏好和具体需求。对于本教程中的“始终过滤”场景,newQuery() 提供了一个简洁直接的解决方案。

总结

通过重写Laravel Eloquent模型的 newQuery() 方法,我们可以优雅地实现多语言数据查询的自动过滤。这种方法将语言过滤逻辑内聚到模型本身,大大简化了应用层代码,提高了可维护性和开发效率。在处理多语言数据时,理解并运用这种机制,能够帮助开发者构建更健壮、更专业的Laravel应用程序。在实际应用中,请根据具体需求权衡其与全局作用域的优劣,选择最适合项目的实现方案。


# php  # laravel  # go  # cad  # app  # 多语言  # 作用域  # 封装  # 父类  # 字符串  # column  # 数据库  # 重写  # 自定义  # 这是  # 我们可以  # 数据查询  # 都将  # 链式  # 更容易  # 这种方法 


相关文章: 沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  网站制作公司,橙子建站是合法的吗?  建站主机如何选?高性价比方案全解析  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何安全更换建站之星模板并保留数据?  建站之星伪静态规则如何正确配置?  如何挑选优质建站一级代理提升网站排名?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  婚礼视频制作网站,学习*后期制作的网站有哪些?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  网站app免费制作软件,能免费看各大网站视频的手机app?  建站之星展会模版如何一键下载生成?  家具网站制作软件,家具厂怎么跑业务?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  已有域名能否直接搭建网站?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何在阿里云ECS服务器部署织梦CMS网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何在云主机快速搭建网站站点?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  如何快速搭建二级域名独立网站?  html制作网站的步骤有哪些,iapp如何添加网页?  北京网站制作公司哪家好一点,北京租房网站有哪些?  代购小票制作网站有哪些,购物小票的简要说明?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  ,购物网站怎么盈利呢?  建站之星代理如何优化在线客服效率?  建站之星安装后如何配置SEO及设计样式?  如何打造高效商业网站?建站目的决定转化率  如何在宝塔面板创建新站点?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  导航网站建站方案与优化指南:一站式高效搭建技巧解析  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  建站主机与虚拟主机有何区别?如何选择最优方案?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何用景安虚拟主机手机版绑定域名建站?  如何通过西部建站助手安装IIS服务器?  如何在景安云服务器上绑定域名并配置虚拟主机?  深圳网站制作培训,深圳哪些招聘网站比较好?  黑客入侵网站服务器的常见手法有哪些?  广东企业建站网站优化与SEO营销核心策略指南  ,南京靠谱的征婚网站?  如何用美橙互联一键搭建多站合一网站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何通过商城免费建站系统源码自定义网站主题?  成都网站制作报价公司,成都工业用气开户费用? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。