Как я могу обновить несколько строк базы данных в одном запросе с помощью Laravel Eloquent

#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