#php #mysql #laravel
Вопрос:
Я пытаюсь обновить несколько строк в таблице, используя Laravel Eloquent. Но, к сожалению, приведенный ниже код обновляет только одну строку. Пожалуйста, что я делаю не так? Не мог бы кто-нибудь помочь, пожалуйста? Овации
public function updateMultipleRows()
{
$accounts = DB::table('payments')->where('inv_status', 1)->get();
if (count($accounts) > 0) {
foreach ($accounts as $account) {
payments::where('id', $account->id)->update([
'earning' => $account->earning = ($account->interest / 100) * $account->inv_amount,
]);
}
}
}
Комментарии:
1. проверьте эту строку
'earning' => $account->earning = ($account->interest / 100) * $account->inv_amount,
. Не может быть = скорее только
Ответ №1:
Я думаю, вам нужно переосмыслить то, что вы храните. Похоже earning
, что это производное значение, основанное на других значениях в базе данных, и хранить его напрямую-плохая идея.
Если вы должны (по какой-либо причине) сделать это, то вы можете попробовать что-то вроде:
payments::where('inv_status', 1)
->update([
'earning' => DB::raw('earning (interest / 100) * inv_amount')
]);
Комментарии:
1. Вау! Отличный код. Ты сделал мой день апокрифосом. Это сработало как белое очарование. Спасибо, чувак. ты великолепен. Много больших пальцев вверх
Ответ №2:
Если вы используете Laravel>8, то вы можете использовать> upsert
, который очень прост в использовании.
$accounts = Payments::where('inv_status', 1)
->get()
->map(function($account){
return [
'earning' => $account->earning ($account->interest / 100) * $account->inv_amount,
'id' => $account->id
]
});
Payments::upsert($accounts, ['earning'], ['id']);
Проверьте эту ссылку: https://laravel.com/docs/8.x/eloquent#upserts