主页/PHP笔记/PHP问答/框架Laravel/在 Laravel 优雅 ORM 中使用 whereJSONContains() 过滤 JSON 列

在 Laravel 优雅 ORM 中使用 whereJSONContains() 过滤 JSON 列

Bug编译狮

Bug编译狮

在 Laravel 中,whereJSONContains() 是一个非常有用的查询方法,用于过滤 JSON 列中的特定值。假设我们有一个名为 users 的模型,并且其中有一个 JSON 字段 preferences,我们可以使用这个方法来查找包含特定键的记录。

以下是一个示例代码,展示了如何在 Laravel 中使用 whereJSONContains() 进行过滤:

// 假设我们有一个 User 模型
use AppModelsUser;

// 使用 whereJSONContains 过滤 preferences 字段中包含 "email" 键的用户
$users = User::whereJsonContains('preferences', 'email')->get();

// 输出结果
foreach ($users as $user) {
    echo $user->name . "n";
}

在这个示例中,User::whereJsonContains('preferences', 'email') 会返回所有 preferences 字段中包含 "email" 键的用户。get() 方法用于执行查询并返回结果集。

示例代码解释

  1. 导入模型:首先,我们需要导入 User 模型。
  2. 使用 whereJsonContains() 方法:我们使用 whereJsonContains 方法来过滤 preferences 字段中包含 "email" 键的用户。
  3. 执行查询:最后,我们调用 get() 方法来执行查询并获取结果集。

通过这种方式,你可以轻松地在 Laravel 中使用 whereJSONContains() 进行复杂的 JSON 查询。

黑板Bug讲师

黑板Bug讲师

介绍

在现代的web应用中,数据通常不再只是简单的行和列。像MongoDB这样的NoSQL数据库以及像PostgreSQL或MySQL的JSON数据类型等SQL数据库中的新功能使得存储复杂且无结构的数据变得常见。Laravel,一个流行的PHP框架,提供了名为Eloquent的强大ORM(对象关系映射),其中包括用于与JSON列交互的手动方法。在这篇教程中,我们将学习如何使用Eloquent处理JSON列。whereJSONContains()可以通过JSON列的值来过滤查询结果的方法。

前置条件

支持JSON列类型(MySQL 5.7+,PostgreSQL 9.4+)的Laravel项目项目

基本的Laravel Eloquent ORM知识

理解PHP和Laravel框架

基本的whereJSONContains()用法

让我们从一个简单的例子开始,我们有一个users表格有一个名为JSON的列。options这一栏可能存储用户偏好或设置。

$users = User::whereJSONContains('options', ['dark_mode' => true])->get();

这个查询会获取所有设置中启用了暗模式的用户。注意:请记得替换[此处]的部分。User请提供具体的模型名称,以便我进行翻译。

高级查询

JSON 列表可以存储数组,因此你可以查询数组中的元素。

$users = User::whereJSONContains('options->themes', 'dark')->get();

在这里,它假设了……options该列有一个在键下的数组。themes,我们正在寻找喜欢“暗”主题的用户。

多个标准

您可能需要检查JSON列中的多个条件,以便进行更精确的搜索。您可以链式操作。whereJSONContains()就像任何其他查询构建方法一样。

$users = User::whereJSONContains('options', ['dark_mode' => true])
             ->whereJSONContains('options', ['language' => 'en'])
             ->get();

这只会返回启用暗模式且已设置语言偏好为英语的用户。

与其他eloquent方法一起使用

一个Eloquent的好处就是你可以组合不同的查询方法来构建你想要的查询。例如,让我们结合使用。whereJSONContains()对不起,我不明白你的意思,请重新描述一下。orWhere()好的,请发送你需要翻译的内容。

$users = User::whereJSONContains('options', ['notifications' => 'email'])
             ->orWhereJSONContains('options', ['notifications' => 'sms'])
             ->get();

这个查询将获取设置通知首选项为电子邮件或短信的用户。

复杂的JSON结构

JSON列可能更加复杂,包含嵌套的数组和对象。你可以仍然使用whereJSONContains()为了高效地查询这些数据。

$users = User::whereJSONContains('options', ['preferences' => ['theme' => 'dark', 'layout' => 'wide']])->get();

该查询将返回所有主题为“黑暗”且布局为“宽”的用户。

结论。

我们已经看到过whereJSONContains()这是一个用于查询Laravel Eloquent中的JSON列的强大工具。无论您的JSON结构是否为简单的键值对还是复杂的对象数组,了解如何构建这些查询可以帮助您充分利用现代数据库的功能。

长工码奴1523

长工码奴1523

Laravel 的优雅 ORM 是一个非常有用的工具,它允许你在模型和查询之间进行更灵活的转换,从而提高性能并简化代码。其中的一个强大功能就是 whereJSONContains() 方法。

这个方法用于过滤数组中的某个键值是否包含特定字符串。这在处理JSON数据时非常有用,特别是在需要检查JSON字段是否包含特定字符串的情况。

下面是一个如何使用 whereJSONContains() 方法的例子:

// 假设我们有一个名为 'users' 的模型,并且我们想要过滤出所有用户的名字是 "John" 的记录

$users = User::all();

$johnUsers = $users->whereJsonContains('name', 'John');

print_r($johnUsers);

在这个例子中,User::all() 将返回所有用户的数组。然后我们调用 whereJsonContains() 方法来筛选出名字为 “John” 的用户。最后,我们打印出筛选后的结果。

注意:在 Laravel 5.4 及更高版本中,whereJsonContains() 已经被移除,现在推荐使用 whereJsonHas()whereJsonNotContains() 替换。但是,如果你正在使用的是 Laravel 5.3,那么上面的方法仍然可以使用。

此外,如果你的数据结构不是 JSON,而是其他格式(如 CSV),你需要稍微修改你的查询来匹配这些格式。例如,如果数据是CSV格式,你可以这样做:

$csvUsers = File::get('path/to/users.csv');
$johnCsvUsers = array_filter($csvUsers, function ($row) {
    return $row['name'] == 'John';
});

在这个例子中,我们首先从文件读取 CSV 数据,然后使用 array_filter() 函数过滤出名字为 “John” 的行。