返回

Laravel 中实现客户姓名唯一性验证:解决 pluck() 方法错误

php

Laravel 中实现唯一值验证

问题

在 Laravel 中,我遇到了一个问题,涉及到在客户姓名上实现唯一性验证。具体来说,客户可以拥有多种姓名,分为“别名”和“以前使用过”两种类型。对于每种类型,名称值都必须是唯一的。然而,在尝试添加或更新客户姓名时,系统却抛出 "调用数组上的 pluck() 成员函数" 的错误。

原因分析

经过调查,发现问题出在使用 pluck() 方法的时候。pluck() 方法通常用于从 Eloquent 集合中提取特定列的值,将其转换为一个数组。然而,在给定的示例中,customerNames() 查询返回的是一个 Eloquent 集合,而随后应用的 where()pluck() 方法将其转换为一个数组。这种转换导致了错误,因为 pluck() 方法期望接收一个集合作为输入。

解决方法

为了解决这个问题,我们需要确保 pluck() 方法接收一个集合作为输入。我们可以通过首先使用 get() 方法获取 Eloquent 集合来实现这一点,然后再应用 pluck() 方法。

$customerPrevious = $customer->customerNames()
    ->where('name_type', '=', 'previous')
    ->get()
    ->pluck('name')
    ->toArray();

通过首先调用 get() 方法,我们确保 pluck() 方法接收一个集合,从而避免了错误。

修改后的代码

修改后的完整代码如下:

$customerPrevious = [];
if ($customer_name['name_type'] == 'previous') {
    //  previous customer_names from server
    $customerPrevious = $customer->customerNames()
        ->where('name_type', '=', 'previous')
        ->get()
        ->pluck('name')
        ->toArray();
    //  previous customer_names from request
    $customerPreviousRequest = $request->customer_names
        ->where('name_type', '=', 'previous')
        ->pluck('name')
        ->toArray();
    $duplicateValue = array_diff($customerPrevious, $customerPreviousRequest);

    if ($duplicateValue.length) {
        return response($exception->getMessage(), 404);
    }
}

常见问题解答

1. 为什么 pluck() 方法需要一个集合作为输入?

pluck() 方法的设计目的是从 Eloquent 集合中提取特定列的值。它期望接收一个集合,因为集合提供了有关如何访问和操作数据的上下文。

2. 除了 get() 方法,还有其他方法可以获取 Eloquent 集合吗?

除了 get() 方法,还可以使用以下方法获取 Eloquent 集合:

  • all():获取所有模型实例
  • find():通过主键查找特定模型实例
  • first():获取第一个模型实例
  • latest():获取按降序排列的模型实例
  • paginate():获取按分页的模型实例

3. 除了 pluck() 方法,还有其他方法可以从集合中提取特定列的值吗?

除了 pluck() 方法,还可以使用以下方法从集合中提取特定列的值:

  • map():将集合中的每个元素映射到一个新集合
  • transform():将集合中的每个元素转换为一个新集合
  • filter():过滤集合中的元素
  • reduce():将集合中的所有元素归并为一个单一的值

4. 什么是 "别名" 和 "以前使用过" 的区别?

在给定的示例中,"别名" 和 "以前使用过" 是客户姓名类型的两个不同类别。别名通常用于指代客户的替代名称,而以前使用过则用于指代客户在过去使用过的姓名。

5. 为什么确保客户姓名类型的唯一性很重要?

确保客户姓名类型的唯一性很重要,因为它有助于防止数据重复和混乱。它还可以简化数据管理和检索,因为您可以自信地找到特定类型的客户姓名,而无需担心重复项。