Создание коллекции из входного массива

#laravel #laravel-4

#laravel #laravel-4

Вопрос:

Допустим, у меня есть форма, представляющая собой счет-фактуру. В нем есть такие позиции, как $product[$key], $quantity[$key]. Таким образом, когда форма отправлена, входные данные выглядят следующим образом

 {
  customer_id : "214"
  product_id: [ "1","5", "6" ],
  quantity: ["34", "1", "54"]
}
 

У меня есть модель для этой таблицы сведений. То, что я делал, это перебирал ее и создавал объект details, а затем сохранял его следующим образом

 foreach($product as $key=>$p)
{
  if($p)
  {
    $t = new Details;
    $t->product = $p;
    $t->quantity = $quantity[$key];
    $t->save();
  }
}
 

Я предполагаю, что есть способ сделать это намного эффективнее. Например, создать коллекцию деталей прямо из входных данных, но я понятия не имею, как я это сделаю

Ответ №1:

Вы можете создавать экземпляры моделей с помощью массового назначения.

 $details = new Details(['product_id'=>'1','quantity'=>'34']);
 

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

Ознакомьтесь с массовым назначением в документах Laravel: http://laravel.com/docs/eloquent#mass-assignment

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

Комментарии:

1. Правильно. Это, по сути, то, что я делаю, просто с большим количеством строк кода. То, что я хочу сделать, это создать коллекцию объектов detail, чтобы я мог сделать что-то вроде order->details()->saveMany($details);

Ответ №2:

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

   $d = array();
    foreach ($details as $detail) {
        $d[] = new OrderDetail($detail);
    }
  $order->details()->saveMany($d);