У меня есть 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);
}
Можно ли оптимизировать мой код, уменьшив количество запросов к базе данных?
sync
вместоdetach
иattach
, чтобы сократить один запрос. ref - person iamab.in   schedule 07.03.2020name
, запрос на обновление не нужен. Нужен только запросinsert
- person iamab.in   schedule 07.03.2020name
, если существует такое жеposition
с именем, но если оно не существует, я должен вставить его в таблицуpositions
. Таблицаpositions
имеет только поле "имя". Как я могу избежать запросов внутри цикла в моем случае? @корзина - person Andreas Hunter   schedule 07.03.2020developer
существует, вам не нужно обновлять эту запись с тем же значениемdeveloper
. - person iamab.in   schedule 08.03.2020WhereIn('name', $positions)
, чтобы получить существующие записи. прокрутите результаты и извлеките найденные значения из массива$positions
. Вставьте оставшиеся значения, используя методinsert()
после цикла. Вы можете снова запустить другой запрос сwhereIn('name', $positions)
, чтобы получитьids
. ИспользуйтеSync
вместоattach
иdetach
- person iamab.in   schedule 08.03.2020