Оптимизируйте создание уникальных данных laravel «многие ко многим» с помощью updateOrCreate

У меня есть 3 модели, в которых я использую отношения many to many

  • Пользователь
  • Позиция
  • Позиция пользователя

Вот мой код, в котором я пытался создать уникальное имя позиции в модели позиции, а затем прикрепить его к пользователю.

Код:

public function createUserPosition()
{
    $user = User::find(1);
    $user->positions()->detach();

    $positions = [
        "developer",
        "coder",
        "singer"
    ];

    $ids = [];
    foreach ($positions as $name) {
        $position = Position::updateOrCreate(
            ["name" => $name],
            ["name" => $name]
        );
        $ids[] = $position->id;
    }

    $user->positions()->attach($ids);

    dd($user->positions);
}

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


person Andreas Hunter    schedule 07.03.2020    source источник
comment
stackoverflow .com/questions/17472128/   -  person Zain    schedule 07.03.2020
comment
используйте sync вместо detach и attach, чтобы сократить один запрос. ref   -  person iamab.in    schedule 07.03.2020
comment
Избегайте запросов внутри цикла. Если вы обновляете только поле name, запрос на обновление не нужен. Нужен только запрос insert   -  person iamab.in    schedule 07.03.2020
comment
Я обновлю поле name, если существует такое же position с именем, но если оно не существует, я должен вставить его в таблицу positions. Таблица positions имеет только поле "имя". Как я могу избежать запросов внутри цикла в моем случае? @корзина   -  person Andreas Hunter    schedule 07.03.2020
comment
Поскольку существует только одно поле, вам не нужно обновлять запись, если она существует. т. е. если позиция developer существует, вам не нужно обновлять эту запись с тем же значением developer.   -  person iamab.in    schedule 08.03.2020
comment
Сделайте запрос с помощью метода WhereIn('name', $positions), чтобы получить существующие записи. прокрутите результаты и извлеките найденные значения из массива $positions. Вставьте оставшиеся значения, используя метод insert() после цикла. Вы можете снова запустить другой запрос с whereIn('name', $positions), чтобы получить ids. Используйте Sync вместо attach и detach   -  person iamab.in    schedule 08.03.2020
comment
В настоящее время ваш метод контроллера имеет 6 запросов для 3 позиций. Но если количество позиций увеличится, количество запросов увеличится. При использовании моего метода количество запросов всегда будет равно 5 независимо от количества позиций   -  person iamab.in    schedule 08.03.2020