2015-04-15 2 views
0

Итак, давайте скажем, что у меня есть api, который возвращает объект данных в json. Объект выглядит следующим образом.Загрузка данных в модели Eloquent

{ 
    "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 объекта вернулись сюда, а именно, первый, позволяет называть его «пользователь», а другой объект, который представляет собой массив внутри первой, «роли». Для пользователя назначены две роли.

Так что скажем, я хочу загрузить эту информацию в мою БД дословно. Я мог бы создать 3 таблицы, «пользователь» и «роли» и «user_roles», причем внешние ключи связывают роли user-> user_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 ; 

я тогда использовал бы ремесленник, чтобы создать красноречивые модели и в модели пользователя, я бы hasManyThrough('roles', 'user_roles');

Что бы самый быстрый и чистый способ загрузки данных из JSON в модель/столы?

Должен ли я просто присваивать значения один за другим или есть способ сопоставить атрибуты из объектов json с красноречивой моделью? Если это возможно, как он справляется с отношениями?

ответ

1

Я думаю, что можно создать модели для каждой таблицы, а затем использовать funcion 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); 
+0

Будет ли '$ user-> role() -> create ($ role);' создавать записи в таблице 'users_roles'? – SynackSA

+0

Да, было бы. Дополнительная информация http://laravel.com/docs/5.0/eloquent#inserting-related-models –

Смежные вопросы