2014-08-27 2 views
0

У меня есть форма, которая допускает несколько записей в базу данных. Каждая из этих строк содержит поле для загрузки файлов.Ошибка Laravel: 'preg_replace(): Несоответствие параметра' для множественной вставки файла

Поля создаются следующим образом:

{{ Form::select('revision[]', ['0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6'], '0', ['class' => 'form-control artwork-revision']); }} 
{{ Form::text('product[]', false, ['class' => 'form-control artwork-product', 'placeholder' => 'Please enter the product name']) }} 
{{ Form::file('file[]', ['class' => 'artwork-file']) }} 

Мой контроллер имеет цикл по каждому элементу для ввода каждой строки в базу данных, но когда я запускаю его, я получаю следующее сообщение об ошибке: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array

код работает, когда он адаптирован для загрузки одного файла (т. е. без цикла foreach и только с одной строкой, которые должны быть вставлены, поля, созданные без квадратных скобок)

Как пропустить эту ошибку и ввести информацию в d atabase?

Вот петля foreach в моем контроллере и var_dump объекта.

Контроллер петли Еогеасп:

$files = Input::file('file'); 

foreach($files as $file) { 
    // it's a new artwork row 
    $artwork = new Artwork; 

    // get the vars 
    $artwork->job_id = Input::get('job_id'); 
    $artwork->revision = Input::get('revision'); 
    $artwork->product = Input::get('product'); 

    // it's pending 
    $artwork->status = 'P'; 

    // sort the filename... 
    $filename = $file->getClientOriginalName(); 
    $file = $file->move(base_path() . '/public/artwork/' . Input::get('job_id'), $filename); 

    // ...and put it in the $artwork object 
    $artwork->filename = 'artwork/' . $artwork->job_id . '/' . $filename; 

    // save it 
    $artwork->save(); 
} 

var_dump ($ работа) выход - обратите внимание, что только одно изображение файла показывает в этом, а не два:

object(Artwork)#243 (21) { 
    ["dates":protected]=> 
    array(1) { 
    [0]=> 
    string(10) "deleted_at" 
    } 
    ["fillable":protected]=> 
    array(6) { 
    [0]=> 
    string(6) "job_id" 
    [1]=> 
    string(8) "filename" 
    [2]=> 
    string(6) "status" 
    [3]=> 
    string(8) "revision" 
    [4]=> 
    string(7) "product" 
    [5]=> 
    string(6) "reason" 
    } 
    ["table":protected]=> 
    string(8) "artworks" 
    ["connection":protected]=> 
    NULL 
    ["primaryKey":protected]=> 
    string(2) "id" 
    ["perPage":protected]=> 
    int(15) 
    ["incrementing"]=> 
    bool(true) 
    ["timestamps"]=> 
    bool(true) 
    ["attributes":protected]=> 
    array(5) { 
    ["job_id"]=> 
    string(1) "5" 
    ["revision"]=> 
    array(2) { 
     [0]=> 
     string(1) "0" 
     [1]=> 
     string(1) "0" 
    } 
    ["product"]=> 
    array(2) { 
     [0]=> 
     string(15) "Twist USB Drive" 
     [1]=> 
     string(19) "Eco Twist USB Drive" 
    } 
    ["status"]=> 
    string(1) "P" 
    ["filename"]=> 
    string(24) "artwork/5/12345-test.jpg" 
    } 
    ["original":protected]=> 
    array(0) { 
    } 
    ["relations":protected]=> 
    array(0) { 
    } 
    ["hidden":protected]=> 
    array(0) { 
    } 
    ["visible":protected]=> 
    array(0) { 
    } 
    ["appends":protected]=> 
    array(0) { 
    } 
    ["guarded":protected]=> 
    array(1) { 
    [0]=> 
    string(1) "*" 
    } 
    ["touches":protected]=> 
    array(0) { 
    } 
    ["observables":protected]=> 
    array(0) { 
    } 
    ["with":protected]=> 
    array(0) { 
    } 
    ["morphClass":protected]=> 
    NULL 
    ["exists"]=> 
    bool(false) 
    ["forceDeleting":protected]=> 
    bool(false) 
} 

ответ

1

Это мой новый «магазин» контроллер, который решает эту проблему:

$artwork = new Artwork; 

     // standard bits 
     $artwork->job_id = Input::get('job_id'); 
     $artwork->status = 'P'; 

     // variables 
     $artwork->revision = Input::get('revision'); 
     $artwork->product = Input::get('product'); 
     $artwork->file = Input::file('file'); 

     // count how many pieces of artwork are being uploaded (this could be any field) 
     $count = count($artwork->revision); 

     /* multi-file upload */ 
     $i = 0; 

     // process each piece  
     foreach($artwork as $a) { 
      while($count > $i) { 
       // it's a new piece of artwork 
       $a = new Artwork; 

       // standard bits to object 
       $a->job_id = $artwork->job_id; 
       $a->status = $artwork->status; 

       // revision and product name to object 
       $a->revision = $artwork->revision[$i]; 
       $a->product = $artwork->product[$i]; 

       // get the file and move it 
       $file = $artwork->file[$i]; 
       $filename = $file->getClientOriginalName(); 
       $movefile = $file->move(base_path() . '/public/artwork/' . $artwork->job_id, $filename); 

       // filename to object 
       $a->filename = $filename; 

       // save the object to db 
       $a->save(); 

       // add 1 to the count 
       $i++; 
      } 
     } 

     return Redirect::route('jobs.index'); 
+0

-1 Это часть вашего вопроса. Это не ответ. –

+0

Нет, это рабочий контроллер, который решает проблему –

+0

Ooops, так что извините, удалите мой голос, затем –

0

Я думаю, что вы не можете даже выберите несколько файлов. Замените поле своего файла на это, у него есть несколько атрибутов, установленных в true, что позволит сразу выбрать несколько файлов и возвращает массив файлов.

{{ Form::file('file[]', ['class' => 'artwork-file','multiple' => true]) }} 
+0

мне нужно каждое поле загрузки файла только взять один файл, а не несколько, так что я не с помощью 'множественных 'атрибут в поле формы. Я все равно давал ему ход, но безрезультатно. Спасибо за ваш ответ. –

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