Laravel updateOrCreate с составным ключом

У меня есть таблица, которая определяется следующим образом:

 Schema::create('tableA', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->integer('label_id')->unsigned();
            $table->date('date');
            $table->integer('value');
            $table->unique(['user_id','label_id','date']);
            $table->timestamps();
        });

В таблице используется составной ключ из user_id, label_id и даты.

Я хотел бы обновить таблицу с помощью метода Model::updateOrCreate таким образом:

 Model::updateOrCreate(
                [
                    'user_id' => $user_id,
                    'label_id' => $label_id,
                    'date' => $date,
                    'value' => $value,
                ]);

Но я получаю сообщение об ошибке, если запускаю метод, когда строка с составным ключом уже существует, потому что кажется, что Laravel не работает с составными ключами.

Например ряд

[
user_id:2,
label_id:3,
date:'2019-04-04',
value: 44
]

нельзя обновить с помощью

Model::updateOrCreate([
    user_id:2,
    label_id:3,
    date:'2019-04-04',
    value: 100
]);

Означает ли это, что нет возможности использовать updateOrCreate, и мне нужно проверять каждую строку, существует ли она, прежде чем я попытаюсь ее добавить?

Какую версию Laravel вы используете?

Rwd 08.04.2019 09:38

Я использую Ларавель 5.6.34.

Yaron 08.04.2019 09:43

Я думаю, что большая проблема здесь в том, что вы пытаетесь использовать опорную точку как обычную модель.

apokryfos 08.04.2019 09:53

@apokryfos .. на каком основании вы называете его пример «обновления» «стержнем»? OP не обрабатывает «промежуточную таблицу» (как Laravel описывает сводную таблицу) — он просто пытается обновить строку, которая имеет составной ключ. Многие из нас, кто разрабатывал данные для буду более 20 лет, используют составные ключи, поскольку они имеют больше смысла и более понятны для нас, чем какое-то случайное бессмысленное поле «id». Так почему же вы описываете это как «стержень»? Я думаю, что принятый ответ довольно хорошо отвечает на вопрос ОП.

McAuley 30.05.2019 01:43

@McAuley Я описываю это как поворотный, потому что составной ключ, похоже, состоит из внешних ключей. Я могу ошибаться, поскольку это явно не указано, но соглашение об именах, похоже, подразумевает это. Если это так, то эта таблица не будет иметь никакого смысла вне контекста описания отношений, и именно это я имею в виду, когда говорю, что это сводная таблица. Я упоминаю об этом только потому, что в Laravel есть инструменты для работы со сводными таблицами через сущности, участвующие в отношениях, и они предпочтительнее прямого манипулирования сводными данными.

apokryfos 30.05.2019 10:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
5
1 057
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы хотите обновить строку на основе user_id, первый параметр updateOrCreate — это массив полей, которые вы хотите сопоставить, а второй содержит поля, которые должны обновляться. Итак, из того, что вы говорите, я считаю, что вы должны использовать это:

Model::updateOrCreate([
    user_id => 2,
    label_id => 3,
    date => new Carbon('2019-04-04')
],
[
    value => 100
]);

Нет, я хотел бы обновить конкретную строку, на которую нацелены все 3 раздела составного ключа — user_id, label_id и дата.

Yaron 08.04.2019 09:42

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