Как использовать метод updateOrInsert построителя запросов? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь использовать метод Eloquent's updateOrInsert для заполнения таблицы mySQL, вот миграция:

Schema::create('myTable', function (Blueprint $table) {
            $table->increments('id');
            $table->time('value1')->nullable();
            $table->time('value2')->nullable();
            $table->time('value3')->nullable();
            $table->time('value4')->nullable();
        });
    }

Вот контроллер:

   DB::connection('myDB')->table('myTable')
            ->updateOrInsert(
                [
                    'id' => $request->id
                ],
                [
                    'value1' => $request->value1,
                    'value2' => $request->value2,
                    'value3' => $request->value3,
                    'value4' => $request->value4
                ]
            );

Вот запрос axios.post():

axios.post("populateMyTable/", {
            id: this.newTableEntry.id,
        value1: this.newTableEntry.value1,
        value2: this.newTableEntry.value2,
        value3: this.newTableEntry.value3,
        value4: this.newTableEntry.value4
    });

Теперь, что я в основном пытаюсь достичь, так это, если в БД нет записи с идентификатором запроса, создайте ее и заполните ее. Если есть, просто обновите значения указанной записи. Тем не менее, я изо всех сил стараюсь сделать работу: если есть запись, я хочу обновить только переданные значения (скажем, value1 / value3) и не трогать другие (поэтому я сделал их nullable();).

Однако, что происходит каждый раз, когда я делаю запись, если некоторые значения остаются пустыми, они обновляются до нуля, независимо от того, содержат ли они уже данные из предыдущих записей, и если, скажем, я уже заполнилvalue1 с 1, и теперь вставьте 1 снова, оно не становится 2 (не добавляет значения из каждого запроса, просто обновляет их). Я чувствую, что все в порядке с этим, но я довольно плохо знаком с mySQL & Eloquent, поэтому, если кто-нибудь сможет мне здесь помочь, это будет здорово! Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Вы можете создать array только с теми данными, которые хотите сохранить.

Как сказал @ rahul-rathore, используйте updateOrCreate метод вместо updateOrInsert.

$data = [];
if ($request->value1) {
    $data['value1'] = $request->value1;
}
if ($request->value2) {
    $data['value2'] = $request->value2;
}

...

DB::connection('myDB')->table('myTable')
    ->updateOrCreate(
        [
            'id' => $request->id
        ],
        $data
    );
0 голосов
/ 16 октября 2019

Спасибо всем, что нашли время ответить на мой вопрос, вот решение, к которому я пришел:

foreach ($request->requestData as $requestData) {
            $filteredRequestData = array_filter($requestData, function ($var) {
                return !is_null($var);
            });
            DB::connection('myDB')->table('myTable')
            ->updateOrInsert(
                [
                    'document_id' => $requestData['document_id'],
                    'row_id' => $requestData['row_id'],
                ],
                $filteredRequestData,
             );

foreach зацикливает данные запроса, метод array_filter фильтрует данные ивозвращает ненулевые переменные, а затем я updateOrInsert это в БД. Надеюсь, это кому-нибудь поможет!

0 голосов
/ 16 октября 2019

Пожалуйста, используйте приведенный ниже пример.

DB::connection('myDB')->table('myTable')
->updateOrCreate(
                [
                    'id' => $request->id
                ],
                [
                    'value1' => $request->value1,
                    'value2' => $request->value2,
                    'value3' => $request->value3,
                    'value4' => $request->value4
                ]
     );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...