#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);