【问题标题】:Loading data into Eloquent models将数据加载到 Eloquent 模型中
【发布时间】:2025-11-23 20:50:01
【问题描述】:

好的,假设我有一个 api,它以 json 格式返回一个数据对象。该对象如下所示。

{
    "id" : 1,
    "name":"SynAck",
    "sex":"Male",
    "age":34,
    "roles": [
        {
            "id":1
            "name":"user"
            "assigned":"2013-06-10"
        },
        {
            "id":1
            "name":"admin"
            "assigned":"2014-01-09"
        }
    ],
    "created":"2014-06-10"
}

如您所见,这里返回了 2 个对象,即第一个,我们称之为“用户”,另一个对象,它是第一个内部的一个数组,“角色”。为用户分配了 2 个角色。

假设我想将这些信息逐字加载到我的数据库中。我可以创建 3 个表,'user' 和 'roles' 和 'user_roles',外键链接 user->user_roles->roles。一个用户有多个角色。

CREATE TABLE IF NOT EXISTS `users` (
  `id`      INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`    VARCHAR(50) NOT NULL,
  `sex`     VARCHAR(10) NOT NULL,
  `age`     SMALLINT(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `roles` (
  `id`          INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`        VARCHAR(50) NOT NULL,
  `assigned`    DATETIME ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `user_roles` (
  `user_id`     INT(12) UNSIGNED NOT NULL ,
  `role_id`     INT(12) UNSIGNED NOT NULL ,
  CONSTRAINT `fk_ur_user_id` FOREIGN KEY(`user_id`) REFERENCES users(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_ur_role_id` FOREIGN KEY(`role_id`) REFERENCES roles(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  UNIQUE `idx_user_id_role_id`(`user_id`, `role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

然后我会使用 artisan 来创建 Eloquent 模型,在用户模型中,我会有一个 hasManyThrough('roles', 'user_roles');

将数据从 json 加载到模型/表中的最快和最干净的方法是什么?

我只需要一个一个地分配值,还是有办法将属性从 json 对象映射到 eloquent 模型?如果这是可能的,它如何处理这些关系?

【问题讨论】:

    标签: php laravel eloquent laravel-5


    【解决方案1】:

    我认为可以为每个表创建模型,然后使用函数json_decode 将 JSON 转换为数组,然后使用 Eloquent 方法保存。原始示例:

    $data = json_decode($json);
    User::create($data);
    

    仍然需要提取关系数据。原始示例:

    $data = json_decode($json);
    $roles = $data['roles'];
    unset($data['roles']);
    
    $user = User::create($data);
    $user->roles()->create($roles);
    

    【讨论】: