Как вставить массив в базу данных? Laravel Php - PullRequest
2 голосов
/ 17 февраля 2020

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

Вот код:

public function something(Request $request)
{
  $id = $request ->id;
  $name = $request->name;
  $money = $request ->money;

  $data = array(
    'name' => $name, 
    'money' => $money,
  );

  $z = User::where('id',$id)
    ->select('name','money')
    ->first();

  $data2 = array(
    'name' => $z->name,
    'money' => $z->money,
  );

  $diff = array_diff($data,$data2);
  $diff_name = array_keys($diff);
  $diff_values = array_values($diff);
  for ($i = 0; $i < count($diff_name); $i++) {
    $z->$diff_name[$i] = $diff_values[$i];
    $z->save();
  }
  return 'Success';
}

Модель:

class User extends Model
{
    protected $table = 'users';
    protected $fillable = ['name','money'];
    public $timestamps = false;
}


$data:
array(2) { ["name"]=> string(9) "Somewhere" ["money"]=> string(7) "5123.00"}

 $data2:
array(2) { ["name"]=> string(8) "Anywhere" ["money"]=> string(7) "5000.00"}

Так что я использую array_diff , чтобы определить, равны ли значения, введенные пользователем, исходному значению из базы данных, если есть разница в затем получите имя столбца ( $ diff_name ) и вставьте новое значение ( $ diff_value ). Я сделал это таким образом, так как мне понадобятся значения $ diff_name для целей журнала истории. Однако я получаю эту ошибку Array to string conversion Заранее спасибо.

1 Ответ

1 голос
/ 18 февраля 2020

Существует несколько встроенных методов Eloquent, которые вы можете реализовать.


    public function something(Request $request)
    {
      $z = User::where('id',$request->id)
        ->select('name','money')
        ->first(); // You could also use '->firstOrFail()' if you want to stop execution if a model was not retrieved. 

      $z->fill([
        'name' => $request->name,
        'money' => $request->money,
      ]);


      $diff = array_keys($z->getDirty());

      $z->save()'

      return 'Success';
    }

$ model-> firstOrFail ()

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


$ model-> fill ()

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


$ request-> only (['name' , 'money])

Вместо передачи массива в $model->fill() вы могли бы также использовать это.


$ модель -> getDirty ()

После изменения атрибутов моделей (и перед их сохранением) вы можете использовать это для получения ассоциативного массива атрибутов и соответствующих значений, которые изменились.

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