Laravel: обновить или создать (upsert) для сводной таблицы

Есть ли способ Laravel (т.е. простой) выполнить upsert в сводной таблице?

Я использую следующий код:

        if ($mpi->sites()->where('site_id', $site_id)->exists())
        {
            $mpi->sites()->updateExistingPivot($site_id, ['pivot_data'=>$pivot_data]);
        }
        else 
        {
            $mpi->sites()->attach($site_id, ['pivot_data'=>$pivot_data]);
        }

Я хочу что-то вроде этого:

$mpi->sites()->updateOrAttach($site_id, ['pivot_data'=>$pivot_data]);

Моя модель Mpi выглядит так:

class Mpi extends Model
{

    public function sites()
    {
        return $this->belongsToMany("App\Site")->withPivot('site_mrn');
    }

    .....

Думаю, вам стоит взглянуть на sync()laravel.com/docs/8.x/…$mpi->sites()->sync($site_id, ['pivot_data'=>$pivot_data]);

Donkarnash 25.12.2020 16:53

Итак, проблема с sync() заключается в том, что он удалит другие связанные записи. Другой альтернативой является syncWithoutDetaching(), которая выдает ошибку, если соответствующая запись уже существует.

mankowitz 25.12.2020 17:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
2
1 389
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы можете использовать newPivotQuery ведьмой Создайте новый построитель запросов для сводной таблицы

$mpi->sites()->newPivotQuery()
          ->updateOrInsert(['mpi_id'=>$mpi->id,'site_id'=>$site->id]
          ,['mpi_id'=>$mpi->id,'site_id'=>$site->id,'pivot_data'=>$pivot_data]);

Другие вопросы по теме