ErrorException (E_NOTICE) Преобразование массива в строку в методе обновления Laravel

Я пытаюсь исправить процесс обновления, у меня есть следующая модель, которая связана с другими моделями и таблицами:

protected $table = 'voting_results';

protected $fillable = ['proceding_id', 'candidate_id', 'politicparty_id', 'total'];

Я отправляю данные из формы следующим образом:

{!! Form::model($electoralrecord, ['method' => 'PATCH','route' => ['electoralrecords.update', $electoralrecord->id], 'enctype' => 'multipart/form-data']) !!}

    <input type="number" class="form-control" id="total" name="total[]" value="{{ $candidate->total }}" placeholder="Values">

    <button class="btn btn-success" type="submit" data-toggle="tooltip" rel="tooltip" data-placement="top" title="Guardar cambios"><i data-feather="save"></i> Save</button>

{!! Form::close() !!}

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

public function update(Request $request, $id)
{

    $data = $request->all(); 

    $ids = $request->id[0];
    $totals = $request->total[0];

    DB::table('voting_results')->where('id', $ids)
        ->update(array(['total' => $totals]));

    return redirect()->route('electoralrecords.index')
                    ->with('success','Record update!!!');

}

Но он возвращает массив ErrorException (E_NOTICE) в преобразование строки.

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

Делая dd переменной $ data, вот результат:

array:4 [▼
  "_method" => "PATCH"
  "_token" => "dHZlKbY1x2xOteQ31pPIMkmwQc3BfHIRWrXlKU87"
  "id" => "1"
  "total" => array:27 [▼
    0 => "12"
    1 => "10"
    2 => "0"
    3 => "0"
    4 => "0"
    5 => "0"
    6 => "0"
    7 => "0"
    8 => "0"
    9 => "0"
    10 => "0"
    11 => "0"
    12 => "0"
    13 => "0"
    14 => "0"
    15 => "0"
    16 => "0"
    17 => "0"
    18 => "0"
    19 => "0"
    20 => "0"
    21 => "0"
    22 => "0"
    23 => "0"
    24 => "0"
    25 => "0"
    26 => "4"
  ]
]

Это Схема и отношения

Schema::create('voting_results', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('proceding_id')->unsigned()->nullable();
    $table->foreign('proceding_id')
        ->references('id')
        ->on('proceedings')
        ->onDelete('cascade');
    $table->integer('candidate_id')->unsigned()->nullable();
    $table->foreign('candidate_id')
        ->references('id')
        ->on('candidates')
        ->onDelete('cascade');
    $table->integer('politicparty_id')->unsigned()->nullable();
    $table->foreign('politicparty_id')
        ->references('id')
        ->on('politicparty')
        ->onDelete('cascade');
    $table->string('total');
    $table->timestamps();
});

person Edward Palen    schedule 18.06.2020    source источник


Ответы (1)


Если у вас есть update (), удалите часть «array ()», поскольку вы уже определили массив с помощью скобок «[]»

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

public function update(Request $request, $id)
{
    $data = $request->all(); 
    $totals = implode(',', $data['total']);

    VotingResult::where('id', $data['id'])
        ->update(array(['total' => $totals]));

    return redirect()->route('electoralrecords.index')
                    ->with('success','Record update!!!');
}

Также вам нужно объяснить, какие столбцы у вас есть и для чего они нужны. т.е. я не знаю, должно ли total содержать целое число или строку? должна ли это быть общая сумма итогов, которые у вас есть в $request->total?

Было бы неплохо также использовать $cast для обозначения некоторых из этих переменных, например:

class VotingResult extends Model
{
   protected $cast = [
      'total' => 'json',
      'proceding_id' => 'integer',
   ];
}

Если в будущем вам придется выполнять математические операции со столбцом total, вам может быть лучше изменить тип столбца total на целое / двойное или, если вам нужно сохранить каждое отдельное значение total, чтобы переместить total в отдельную таблицу.

person Vlad Vladimir Hercules    schedule 18.06.2020
comment
Да, я остался, но я уже изменил его, в этом случае он обновляет первую запись, остальные не обновляют их. - person Edward Palen; 19.06.2020
comment
Я пробовал делать это с помощью foreach и других методов, но он по-прежнему возвращает ту же ошибку. - person Edward Palen; 19.06.2020
comment
Не могли бы вы сделать dd ($ request- ›all ()) и опубликовать результаты? - person Vlad Vladimir Hercules; 19.06.2020
comment
Кроме того, не следует ли использовать переменную $ data вместо $ request для $ ids и $ totals? - person Vlad Vladimir Hercules; 19.06.2020
comment
Что должен содержать столбец «Итого»? Похоже, вы пытаетесь вставить массив данных в один столбец, поэтому вы можете превратить итоги в строку, используя implode - implode (‘,’, $ data [‘total’]). Кроме того, если вы хотите сохранить массив данных, вам может быть лучше хранить данные в виде JSON. - person Vlad Vladimir Hercules; 19.06.2020
comment
Я пробую вот так DB :: table ('vote_results') - ›where ('id', $ id) -› update (implode (',', $ data ['total'])); - person Edward Palen; 19.06.2020
comment
Но он возвращает Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_RECOVERABLE_ERROR) Аргумент 1, переданный в Illuminate \ Database \ Query \ Builder :: update (), должен иметь тип массив, заданная строка, вызываемая в C: \ laragon \ www \ electoralrecord \ app \ Http \ Controllers \ Admin \ ElectoralRecordController.php в строке 257 - person Edward Palen; 19.06.2020
comment
Вам нужно будет выполнить обновление ([‘total’ = ›implode (...)]) - person Vlad Vladimir Hercules; 19.06.2020
comment
Кроме того, что касается $ ids, просто используйте $ data [‘id’]. Это потому, что id в вашем запросе является строкой - person Vlad Vladimir Hercules; 19.06.2020
comment
Хорошо, я понимаю, но пытаясь сделать это так, как вы предложили, продолжайте генерировать ошибку преобразования: ErrorException (E_NOTICE) снова. - person Edward Palen; 19.06.2020
comment
DB :: table ('vote_results') - ›где ('id', $ id) -› update (['total' = ›implode ($ data)]); - person Edward Palen; 19.06.2020
comment
DB :: table ('vote_results') - ›where ('id', $ id) -› update (['total' = ›implode (‘, ’, $ data [‘ total ’])]); ? - person Vlad Vladimir Hercules; 19.06.2020
comment
Извините, он плохо структурирован. - person Edward Palen; 19.06.2020
comment
но теперь результат такой: - person Edward Palen; 19.06.2020
comment
Illuminate \ Database \ QueryException (01000) SQLSTATE [01000]: Предупреждение: 1265 Данные усечены для столбца «Итого» в строке 1 (SQL: обновление voting_results set total = 12,10,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4 где id = 1) - person Edward Palen; 19.06.2020
comment
Это означает, что ваш столбец в базе данных слишком мал, вам нужно изменить его тип и / или длину. Какой у вас тип столбца для итогов? - person Vlad Vladimir Hercules; 19.06.2020
comment
Да, тогда я просматривал структуру db, и этот столбец был целым числом, затем я изменил его как bigInteger, и по мере его работы он похож на строку, но вставляет всю строку, по умолчанию он регистрирует то же самое запись в каждой строке и в процессе составляет 27, поэтому они регистрируются повторно. - person Edward Palen; 19.06.2020
comment
Итак, как вы хотели хранить эти данные? Что представляют собой данные в "общем"? Почему у вас было 27 элементов в "общем" массиве? - person Vlad Vladimir Hercules; 20.06.2020
comment
Здравствуйте, спасибо, что снова ответили, общий результат - это процесс голосования, каждое общее значение - это значение, зарегистрированное каждым кандидатом в процессе голосования. - person Edward Palen; 20.06.2020
comment
Структура таблицы - это processing_id, это то место, где базовые данные этой записи, и у нее есть связь, затем есть кандидата_id, которая является отношением этого с кандидатами, а итог - это результат каждого из них. - person Edward Palen; 20.06.2020
comment
Зачем их обновлять? Это процесс в случае ошибки при записи суммы каждой записи и значений кандидатов. - person Edward Palen; 20.06.2020
comment
Возможно, я недостаточно подробно описал процесс, чтобы интерпретировать то, что я на самом деле пытаюсь сделать, поскольку, используя методы implode или foreach, я не вставляю значения, которые соответствуют ему отношениями, которые я определил. - person Edward Palen; 20.06.2020
comment
Похоже, что общая сумма должна содержать общий результат, возможно, было бы лучше иметь отдельную таблицу для этих значений. - person Vlad Vladimir Hercules; 20.06.2020
comment
Хорошо, я вижу, что мне придется это сделать, потому что связь, которая есть в таблице кандидатов (кандидата_id), заключается в получении связанных результатов для отчетов. - person Edward Palen; 20.06.2020