2016-04-05 6 views
3

Мне нужно сохранить точно три страницы сразу через форму. Я хотел бы сохранить так же, как метод save(), потому что это автоматически обновит метки времени записи.Laravel 5.2 несколько моделей save()

Как это сделать для нескольких записей одновременно?

Моя страница Модель:

namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Page extends Model{ 
    protected $table = 'simple_pages'; 
} 

Мой код:

public function createPages(Request $request){ // I use Page at the top 
    $data = [ 
      [ 
      'title'=> $request->first, 
      'content'=> $request->firstCont 
      ],[ 
      'title'=> $request->second, 
      'content'=> $request->secondCont 
      ][ 
      'title'=> $request->third, 
      'content'=> $request->thirdCont 
      ] 
    ]; 
    Page::unguard(); 
    $pages = new Page($data); 
    $pages->save(); // Something like this would be amazing 
    Page::reguard(); 
} 

Примечание: Я сильно против создания нескольких экземпляров модели страницы, а затем цикл их чтобы сохранить их каждую индивидуальность. Кроме того, я не хочу использовать вставку DB, потому что она не будет автоматически обновлять метки времени.

ответ

1

После долгих долгих поисков похоже, что я нашел это:

 $eloquentCollection->each(function ($item, $key) { 
      $item->save(); 
     }); 

Да, это итерация, но похоже, нет никаких других способов, как сэкономить несколько моделей. Единственная альтернатива - использовать DB::insert(), но имейте в виду, что у вас нет автоматических обновленных временных меток.

Кроме того, если вы хотите иметь слишком много красноречивых моделей для сохранения, сохраните их кусками из-за возможных проблем с памятью (или нажмите их в Queue).

2

Если вы читаете инструкцию Mass Assignment.

public function createPages(Request $request){ // I use Page at the top 
    $data = [ 
      [ 
      'title'=> $request->first, 
      'content'=> $request->firstCont 
      ],[ 
      'title'=> $request->second, 
      'content'=> $request->secondCont 
      ][ 
      'title'=> $request->third, 
      'content'=> $request->thirdCont 
      ] 
    ]; 

    Page::unguard(); 
    $pages = Page::create($data); 
    Page::reguard(); 
} 
+0

Спасибо за ответ. Я уже читал официальные документы, но мне это не помогло. Page :: create ($ data) создает исключение (preg_match() ожидает, что параметр 2 будет строкой, заданный массив); Я также попробовал Page :: create ([... first ....], [... second ....], [... third ....]), но он просто вставляет одну пустую запись в базы данных, чего я не хочу достичь. – Fusion

+0

Но если ваши столбцы не указаны внутри 'protected $ fillable = []', это не будет работать. Если вы установили '$ fillable' и ваши массивы установлены, вам нужно убедиться, что ваши значения - это строки, а не массивы. то есть '$ request-> first' и' $ request-> firstCont' – ash

+0

Я использовал методы модели unguard() и reguard(). Поэтому охраняемый/заполняемый не должен быть проблемой здесь (или это?). Если это будет проблема, Laravel исключит исключение массового назначения). Я на 100% уверен, о содержании моих запросов. Недавно я проверил dd(). Все они - струны. – Fusion

0

Вот лучшее решение, которое я нашел, чтобы реализовать

User::create([array of multiple user detail arrays])

с избежать необходимости выполняет столько запросов, как у вас есть записи, чтобы добавить

Allow Eloquent to save multiple records at once

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