laravel 5.1 ErrorException: preg_replace (): несоответствие параметров, шаблон — это строка, а замена — массив

У меня есть следующая модель с заполняемыми свойствами:

class Job extends Model {

    protected $fillable = [
      'job_type_id',
      'recruiter_id',
      'start_at',
      'end_at',
      'job_title',
      'job_ref',
      'job_desc'

    ];

    // other stuff
 }

У меня есть форма для обновления задания, которая включает в себя несколько раскрывающихся списков с множественным выбором:

<form class="js-job-posting" enctype="multipart/form-data" accept-charset="UTF-8" action="http://localhost:8000/jobs/2" method="POST">
   <input type="hidden" value="PATCH" name="_method">
   <input type="hidden" value="iElj170OKBLg9THP7iETwsn34iuVhdpBX3hF98UA" name="_token">
   <div class="form-group ">
       <label for="job_title">Job title</label>
       <input id="job_title" class="form-control" type="text" name="job_title">
   </div>

   <div class="form-group ">
      <label for="industry_list">Industry</label>
      <select id="industry_list" class="form-control name="industry_list[]" multiple="" >
         <option value="1">Accounting</option>
         <option value="37">Administration</option>
          ...
       </select>
    </div>
 </form>

В моем контроллере у меня есть следующий метод обновления задания, но я получаю сообщение об ошибке:

ErrorException in helpers.php line 671: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array

Похоже, что использование Auth::user()->recruiter->jobs()->update($request->except('job_type_id')); вызывает эту ошибку, потому что объект запроса содержит массив для industry_list. Но какое это имеет значение, если я определил массовые заполняемые атрибуты в классе Job?

public function update(JobRequest $request, $id)
{
   $job = Job::findOrFail($id);

   Auth::user()->recruiter->jobs()->update($request->except('job_type_id'));

   $job->industries()->sync($request->input('industry_list'));

   flash()->success('Job details have been updated');

   return redirect('/job/' . $id . '/edit');
}

Как ни странно, когда я исключаю Industry_list следующим образом: Auth::user()->recruiter->jobs()->update($request->except('job_type_id', industry_list'));, а затем делаю обновление, я получаю следующую ошибку sql:

 SQLSTATE[42S22]: Column not found: 1054 Unknown column '_method' in 'field list' (SQL: update `jobs` set `_method` = PATCH, `_token` = iElj170OKBLg9THP7iETwsn34iuVhdpBX3hF98UA,...

Почему генерируется SQL, включая все поля в форме для обновления, включая _method и _token?

Это как-то связано с тем, что построитель запросов игнорирует заполняемые поля?


person adam78    schedule 06.09.2016    source источник


Ответы (1)


Если у вас есть только одно поле для обновления, используйте:

->update($request->only('job_title'));

в противном случае вы должны исключить все другие поля, подобные этому:

->update($request->except(['job_type_id', 'industry_list', '_method', '_token']));

Свойство $fillable не просматривается при обновлении отношения.

person revo    schedule 06.09.2016
comment
Я уже пробовал это - см. мой отредактированный пост. Выполнение того, что вы сказали, дает мне ошибку SQL, когда команда обновления SQL пытается обновить столбцы _method и _token, которых явно нет в модели Job. Похоже, что заполняемые свойства не применяются - person adam78; 06.09.2016
comment
Каков результат print_r($request->except(['job_type_id', 'industry_list']));? - person revo; 07.09.2016
comment
Array ( [_method] => PATCH [_token] => iElj170OKBLg9THP7iETwsn34iuVhdpBX3hF98UA [job_title] => test ... ) Простое исключение этих полей из обновления не является правильным решением. - person adam78; 07.09.2016
comment
Если у вас есть только одно поле для обновления, используйте ->update($request->only('job_title'));, в противном случае вам следует исключить все другие поля, подобные этому ->update($request->except(['job_type_id', 'industry_list', '_method', '_token']));. $fillable не просматривается при обновлении отношения. - person revo; 07.09.2016
comment
У меня есть много полей для обновления. Есть ли способ обновить модель и использовать ее заполняемые свойства. Почему это работает в методе создания: Auth::user()->recruiter->jobs()->create($request->all()); - person adam78; 07.09.2016
comment
Я не уверен в этом и не знаю, исправлено ли это в Laravel 5.3. Но если он поставляется с новым Laravel, вы, вероятно, можете объединить эти изменения в свою установку. - person revo; 07.09.2016