使用 Laravel 模型保存多级数组

Posted

技术标签:

【中文标题】使用 Laravel 模型保存多级数组【英文标题】:Save multi-level array using Laravel Model 【发布时间】:2020-10-23 21:55:41 【问题描述】:

我无法使用 Laravel-7 模型保存这些数据

这是我的数据

    $supplier = [
      'name'  => 'Supplier 1',
      'pic'   => [
        [
          'name' => 'PIC 1',
          'phone_number'  => [
            ['number' => '111111'],
            ['number' => '123456']
          ]
        ],
        [
          'name' => 'PIC 2',
          'phone_number'  => [
            ['number' => '222222']
          ]
        ]
      ]
    ];

这是我的模型 Supplier.php

    // Supplier.php
    public function supplier_pic()
    
        return $this->hasMany('SupplierPIC');
    

和其他型号

    // SupplierPIC.php
    public function supplier()
    
        return $this->belongsTo('Supplier');
    

    public function pic_phone_number()
    
        return $this->hasMany('SupplierPICPhoneNumber');
    
    // SupplierPICPhoneNumber.php
    public function supplier_pic()
    
        return $this->belongsTo('SupplierPIC');
    

如何将这些数据保存在控制器上? 谢谢

【问题讨论】:

【参考方案1】:

你只需要把它分解成它的组成对象。

在您的情况下,它是一个 Supplier 对象和两个 SupplierPIC 对象,每个对象都有一个 SupplierPICPhoneNumber

    创建供应商
$supplier = Supplier::firstOrCreate([
   'name' => 'Supplier 1'
]);
    创建供应商图片
collect($data['pics'])->each(function ($pic) use ($supplier) 
    // Create the PIC
    $x = SupplierPIC::create([
        'name' => $pic['name']
    ]);

    // Attach it to the supplier
    $supplier->supplier_pic()->save($x);

    // Attach phone numbers
    collect($pic['phone_number'])->each(function ($number) use ($x) 
        // Create the PIC Phone number
        $y = SupplierPICPhoneNumber::create([
            'number' => $pic['number']
        ]);
        // Attach the number to the PIC
        $x->pic_phone_number()->save($y);
    );
);

建议

关系的命名不遵循最佳实践,这有点令人困惑。尝试使用带有复数形式的 hasMany 类型关系命名事物(即 pic_phone_numbers 而不是 pic_phone_number) 您需要SupplierPICPhoneNumber 的完整模型吗? json 列可能更适合。

【讨论】:

哇,谢谢,非常有帮助,感谢您的建议

以上是关于使用 Laravel 模型保存多级数组的主要内容,如果未能解决你的问题,请参考以下文章

将数组从 AuthController 传递到 Laravel 5 中的登录视图

尝试从子模型重新访问父模型的 laravel 多级关系急切加载问题

如何使用 Laravel 创建数据库驱动的多级导航菜单

Laravel 多级关系

Laravel session的保存机制

如何在 Laravel Eloquent 中构建具有多级关系的查询