Laravel, синхронизировать данные с Pivot - PullRequest
1 голос
/ 10 июля 2019

Laravel 5.3, у меня есть 2 модели:

Пользователь:

public function newFunctions()
{
    return $this
        ->belongsToMany('App\NewFunctions', 'user_newfunctions')
        ->withPivot(['function_count', 'days_count']);
}

NewFunctions:

public function users()
{
    return $this
        ->belongsToMany('App\User', 'user_newfunctions', 'new_function_id', 'user_id')
        ->withPivot(['function_count', 'days_count']);
}

Теперь я могу сохранить новые данные для пользователя с помощью этого:

$user = User::findOrFail($id);
$user->name = $request->input('name');
$user->save();

Но теперь мне нужно обновить некоторые значения сводной таблицы. сводная таблица выглядит так:

user_id | new_functions_id | function_count | days_count
---------------------------------------------------------
    814 |           1      |   5            |2019-07-19 12:26:19
    814 |           3      |   7            |2019-07-19 12:26:19

У меня более 1 строки на user_id. Я пытался использовать:

$user
    ->newFunctions()
    ->sync([
        'days_count' => $test_date,
        'function_count' => $test_int_number
    ]);

Но я получаю сообщение об ошибке:

Неверный тип смещения

потому что пытается обновить с этим:

array(
    'records' => array(
        'days_count' => object(Carbon), 'function_count' => '66'),
        'results' => array(),
        'id' => object(Carbon),
        'attributes' => array()

    )
)

in BelongsToMany.php

Итак:

  • Как я могу обновить значения для каждого user_id в сводной таблице?
  • А как использовать sync для обновления только 'function_count' и 'days_count'? они приходят из запроса.

1 Ответ

1 голос
/ 10 июля 2019

->sync() не используется таким образом;он используется для attach() и detach(), связанных new_function_ids, пока присутствуют только ids в sync().Вы, вероятно, ищете updateExistingPivot()

Пример ->sync() будет использовать массив:

$user->newFunctions()->sync([
    "new_function_id" => 1,
    "function_count" => 6,
    "days_count" => "2019-07-08 12:00:00",
]);

Это удалит запись, где new_function_id равно 3,и обновляя значения, где new_function_id равно 1.

Чтобы обновить function_count и days_count для new_function_id из 1 или 3, используйте ->updateExistingPivot() (передайте id вы хотите обновить как первый параметр):

$user
    ->newFunctions()
    ->updateExistingPivot("1", [
        "function_count" => 6,
        "days_count" = "2019-07-08 12:00:00"
    ]);
// or $user->newFunctions()->updateExistingPivot("3", ...);

Это обновит сводную таблицу, где new_function_id равно 1, оставляя строку, где new_function_id равно 3.

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

...