Красноречивая модель, обновляющая больше строк, чем должна laravel php

У меня есть таблица без первичного ключа, которая выглядит так:

ID пользователя config_key config_value 2296 config_key_1 config_value_1 2296 config_key_2 config_value_2 2296 config_key_3 config_value_3 2296 config_key_4 config_value_4

И каждый раз, когда я пытаюсь обновить одно значение из этой таблицы, по какой-то причине остальная часть таблицы обновляется теми же значениями, например:

ID пользователя config_key config_value 2296 config_key_1 config_value_1 2296 config_key_2 config_value_1 2296 config_key_3 config_value_1 2296 config_key_4 config_value_1

Мой запрос выглядит так:

$ConfigValue = AppUserConfig::where('user_id', 2296)
                ->where('config_key', 'config_key_1')
                ->first();
$ConfigValue->config_value = config_value_1;
$ConfigValue->save();

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

ID пользователя config_key config_value 2296 config_key_1 config_value_1 2296 config_key_2 config_value_2 2296 config_key_3 config_value_3 2296 config_key_4 config_value_4

К этому:

ID пользователя config_key config_value 2296 config_key_1 новое_пользовательское_значение 2296 config_key_2 config_value_2 2296 config_key_3 config_value_3 2296 config_key_4 config_value_4

Но не уверен, что происходит :(

Оба решения в значительной степени решили эту проблему, спасибо всем.

Не могли бы вы опубликовать немного больше фактического кода PHP, чтобы мы могли понять, в каком контексте вы выполняете этот запрос?

Laisender 07.02.2023 18:58
$ConfigValue->config_value = config_value_1; <- Это опечатка? config_value_1 без ' или ", скорее всего, вызовет какую-то ошибку (если только вы не определили ее как константу и т. д.)
Tim Lewis 07.02.2023 18:59

Поскольку у вас нет первичного ключа, вам, вероятно, придется сделать это с помощью Query Builder вместо использования Eloquent или использовать Eloquent с Query Builder. Но вы не сможете вытащить одну запись как объект для ее обновления.

aynber 07.02.2023 19:00
github.com/laravel/framework/issues/29984
RiggsFolly 07.02.2023 19:03

Кроме того, метод save(), вероятно, потерпит здесь неудачу, потому что он пытается обновить строку по определенному первичному идентификатору в таблице.

Laisender 07.02.2023 19:13

почему бы не сделать это one to many отношения. Я не могу понять, что вы делаете в этом сценарии. Вместо того, чтобы усложнять первичный ключ, вы можете сделать так:User->AppConfig чтобы его было легко читать и поддерживать

Japs 08.02.2023 06:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
6
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ничего странного не происходит, когда вы обновляете запись с помощью Eloquent, ваш оператор обновления будет использовать первичный ключ для идентификации этой записи, мы можем просто предположить, что он пытается обновить все строки с идентификатором 2296. вы можете использовать инструменты отладки, такие как clockwork или telescope, чтобы проверить фактические запросы операторов SQL при запуске кода.

Вы также можете попробовать использовать построитель запросов для оператора обновления. э.и.

DB::table('app_user_config_whatever')
    ->where('user_id', 2296)
    ->where('config_key', 'config_key_1')
    ->update(['config_value' => 'config_value_1']);

но лучшим подходом было бы создать правильные отношения между пользователем и конфигурацией, например, иметь конфигурацию belognsTo пользователя, тогда вы можете выполнить что-то вроде

$user->config()
    ->where('config_key', 'config_key_1')
    ->update(['config_value' => 'config_value_1']);

или

$user->config()
    ->updateOrCreate( 
        ['config_key' => 'config_key_1' ], 
        ['config_key' => 'config_key_1', 'config_value' => 'config_value_1'] 
    );

вы можете обновить, используя запрос на обновление, подобный этому

$ConfigValue = AppUserConfig::where('user_id', 2296)
                ->where('config_key', 'config_key_1')
                ->update(['config_value'=>'config_value_1']);

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