编程

查询构造器 whereAll() 和 whereAny() 方法添加到 Laravel 10.47

752 2024-03-14 03:46:00

Laravel 团队发布了 v10.47,它向查询构造器添加了 whereAllwhereAny 方法,以及在 Collection sortByMany 方法使用排序 flag 的能力,等等。

此次发布可能是 Laravel 11 于2024年3月12日(星期二)发布之前 10.x 分支的最后一次发布。Laravel 10 将继续接受漏洞修复,直到 2024 年 8 月 6 日,安全修复将持续到 2025 年 2 月 4 日。

新增 whereAll 和 whereAny 查询构造器方法

@musiermoore 贡献了新的 whereAllwhereAny 方法,以及 orWhereAllorWhereAny 方法。这些新方法可以使用 or 或者 and 逻辑搜索多个字段

// 以前使用 `orWhere`
User::query()
    ->where(function ($query) use ($search) {
    $query
        ->where('first_name', 'LIKE', $search)
        ->orWhere('last_name', 'LIKE', $search)
        ->orWhere('email', 'LIKE', $search)
        ->orWhere('phone', 'LIKE', $search);
    });
 
// 使用 `whereAny`
User::whereAny(
    [
        'first_name',
        'last_name',
        'email',
        'phone'
    ],
    'LIKE',
    "%$search%"
);

以下是 whereAll 的示例,其中所有字段需要匹配 AND:

$search = 'test';
 
User::whereAll([
    'first_name',
    'last_name',
    'email',
], 'LIKE', "%$search%");
 
/*
SELECT * FROM "users" WHERE (
  "first_name" LIKE "%test%"
  AND "last_name" LIKE "%test%"
  AND "email" LIKE "%test%"
)
*/

你可以使用 orWhereAllorWhereAny 方法,联合多个 like.

在 sortByMany 集合上支持排序选项 Flag

Tim Withers 贡献了传递多个排序选项传递给集合的 sortBy 方法的能力。在此更新之前,你可以使用多个 callable 来实现此功能,而现在可以使用排序 Flag:

// Pull Request before example
$this->campaigns = $campaigns
    ->with('folder', 'campaignCategory')
    ->get()
    ->sortBy([
        fn ($a, $b) => str($a->folder?->name)->lower() <=> str($b->folder?->name)->lower(),
        fn ($a, $b) => str($a->campaignCategory->name)->lower() <=> str($b->campaignCategory->name)->lower(),
        fn ($a, $b) => str($a->name)->lower() <=> str($b->name)->lower(),
    ])
 
// Using sorting flags
$this->campaigns = $campaigns
    ->with('folder', 'campaignCategory')
    ->get()
    ->sortBy(['folder.name', 'campaignCategory.name', 'name'], SORT_NATURAL | SORT_FLAG_CASE)

你可以在 PHP 手册的 sort 函数 中了解更多排序 Flag 内容。

在队列监听器上设置 $failOnTimeout

Saeed Hosseini 贡献了在队列任务上设置 $failOnTimeout 属性的能力,该属性用来说明如果超时任务是否失败:

class UpdateSearchIndex implements ShouldQueue
{
    public $failOnTimeout = false;
}

更新日志

你可以在下面看到新功能和更新的完整列表,以及 GitHub上 10.46.0 和 10.47.0 之间的差异。以下直接来自更新日志:

#v10.47.0