У меня есть таблица без первичного ключа, которая выглядит так:
И каждый раз, когда я пытаюсь обновить одно значение из этой таблицы, по какой-то причине остальная часть таблицы обновляется теми же значениями, например:
Мой запрос выглядит так:
$ConfigValue = AppUserConfig::where('user_id', 2296)
->where('config_key', 'config_key_1')
->first();
$ConfigValue->config_value = config_value_1;
$ConfigValue->save();
Мне просто нужно обновить одну строку моей таблицы из этого:
К этому:
Но не уверен, что происходит :(
Оба решения в значительной степени решили эту проблему, спасибо всем.
$ConfigValue->config_value = config_value_1;
<- Это опечатка? config_value_1
без '
или "
, скорее всего, вызовет какую-то ошибку (если только вы не определили ее как константу и т. д.)
Поскольку у вас нет первичного ключа, вам, вероятно, придется сделать это с помощью Query Builder вместо использования Eloquent или использовать Eloquent с Query Builder. Но вы не сможете вытащить одну запись как объект для ее обновления.
Кроме того, метод save()
, вероятно, потерпит здесь неудачу, потому что он пытается обновить строку по определенному первичному идентификатору в таблице.
почему бы не сделать это one to many
отношения. Я не могу понять, что вы делаете в этом сценарии. Вместо того, чтобы усложнять первичный ключ, вы можете сделать так:User->AppConfig
чтобы его было легко читать и поддерживать
Ничего странного не происходит, когда вы обновляете запись с помощью 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']);
Не могли бы вы опубликовать немного больше фактического кода PHP, чтобы мы могли понять, в каком контексте вы выполняете этот запрос?