【问题标题】:Using createMany in Laravel returns null error when array used is populated填充使用的数组时,在 Laravel 中使用 createMany 返回 null 错误
【发布时间】:2022-01-29 06:27:58
【问题描述】:

我有一个 $new 集合,它由一个数组组成,我 collect 允许我使用 Collection 函数运行各种过滤器。

使用Log:info($new) 我的最终集合打印出以下内容:

local.INFO: {"1":{"name":"11","position":1},"2":{"name":"22","position":2},"3":{"name":"33","position":3}}

完成后,我使用以下方法在我的 QueueLane 模型中创建这些记录:

$new_records = $business->queue_lanes()->createMany($new);

你可以看到我通过从我的 $business 变量中插入一个关系来做到这一点,这只是一个 Business 模型。 queue_lanes() 是我与 Business 模型的相关关系的名称。

执行此行时出现以下错误:

[2022-01-29 06:18:01] local.ERROR: SQLSTATE[23502]: Not null 违规:7 错误:“名称”列中的空值违反非空 约束细节:失败行包含(19,null,null,null, 2022-01-29 06:18:01、2022-01-29 06:18:01、1、4,空)。 (SQL:插入 进入 "queue_lanes" ("name", "position", "business_id", "updated_at", "created_at") 值 (?, 1, 4, 2022-01-29 06:18:01, 2022-01-29 06:18:01) 返回 "id") {"userId":4,"exception":"[object] (照亮\数据库\查询异常(代码:23502):SQLSTATE [23502]: 非空违规:7 错误:“名称”列中的空值违规 非空约束细节:失败行包含 (19, null, null, 空,2022-01-29 06:18:01,2022-01-29 06:18:01,1、4,空)。 (SQL: 插入 "queue_lanes" ("name", "position", "business_id", "updated_at", "created_at") 值 (?, 1, 4, 2022-01-29 06:18:01, 2022-01-29 06:18:01)返回“id”)在 /Users/Username/Sites/test-app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:712)

QueueLane 模型具有应填充的 nameposition 属性,但它看起来不像;而且我不知道为什么要查看$new 输入数组。我能想到的唯一可能原因是数组键可能是被读取为列名而不是嵌套数组的内容。

我的QueueLane 模型中的$fillable 变量中也有name 属性。

编辑:
我试过运行$new->each(function ($row, $key) use ($business) 并插入每条 $row 记录,但这仍然会带来同样的问题。

第二次编辑:
我的 Business.php 模型

class Business extends Model
{
    protected $fillable = [
        'name',
        'business_type_id',
        'vanity_url',
        'allow_self_check_in',
        'enable_self_check_in',
        'enable_multi_queue',
        'multi_queue_active',
        'accept_new_entrants',
        'enable_shortest_option',
        'default_shortest',
    ];

    protected $casts = [
        'is_active'                 => 'boolean',
        'enable_sms_sender_id'      => 'boolean',
        'enable_self_check_in'      => 'boolean',
        'multi_queue_active'        => 'boolean',
        'allow_self_check_in'       => 'boolean',
        'accept_new_entrants'       => 'boolean',
        'enable_shortest_option'    => 'boolean',
        'default_shortest'          => 'boolean',
    ];
...

QueueLane.php

...
class QueueLane extends Model
{

    use SoftDeletes;

    protected $fillable = [
        'name',
        'min_head_count',
        'max_head_count',
        'position',
        'business_id'
    ];
...
    const DEFAULT_QUEUE = '#Default';

    public function setNameAttribute($value)
    {
        $this->attributes['name'] = $value == 'Default Queue' ? QueueLane::DEFAULT_QUEUE : $this->name;
    }

我的 Business 或 QueueLane 模型中没有受保护的变量。

【问题讨论】:

  • 您是否尝试通过调用集合上的toArray() 将其作为文档中所示的数组传递?
  • 尝试使用$new->values() 而不仅仅是$new 以确保集合包含非关联数组,因为看起来您的集合没有从0 开始的数字键并且可能最终会最后作为关联数组处理
  • @apokryfos 谢谢,我不知道 Laravel 中有 values() 函数,但是我尝试了这个并得到了相同的结果。
  • @harishdurga 我尝试了$new->values()$new->toArray(),都得到了相同的结果。
  • 试试$business->queue_lanes()->createMany([['name'=>'My Name','position'=>1],['name'=>'My Second Name','position'=>2]]) 我的意思是尝试使用一些静态数据来了解问题是出在使用集合还是其他方面。

标签: php laravel postgresql laravel-8


【解决方案1】:

请检查您的QueueLane 模型,其中有setNameAttribute mutator,这会导致将name 属性值设置为null。在 mutator 中 $this->name 将返回 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2022-01-01
    • 2020-04-08
    • 2023-01-25
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多