установите флажок для удаления просроченных сообщений laravel - PullRequest
0 голосов
/ 20 января 2020

У меня есть модель поста, которую пользователь будет увеличивать в течение некоторого определенного времени, и теперь у меня есть задание на запуск, которое запускается каждые 15 минут, чтобы запустить специальный сценарий, чтобы увидеть, был ли пост увеличен или завершен. но проблема в том, что каждый раз, когда он зацикливает все сообщения, и это занимает определенное количество времени, я хотел знать, есть ли альтернатива и лучшие способы сделать это ?? вот мой код ниже:

$boosted = POST::whereIn('status_id', [4, 5, 6])->where('boosted',1)->get();
        foreach ($boosted as $index => $item) {
            if ($item->boosted_until < Carbon::now()) {
                $wish = Wish::find($item->id);
                $wish->boosted = 0;
                $wish->save();
            }

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Следуя моим комментариям на ваш вопрос, вы можете получить что-то похожее, но точное:

Если оно установлено как отношение


Wish::whereHas('posts', function($query){ 
    $query->where('boosted_until', '<', Carbon::now());
})->where('boosted', 1)->update(['boosted' => 0]);

1 голос
/ 20 января 2020

К счастью, мы можем использовать готовую загрузку, чтобы сократить эту операцию до 2 запросов. При запросе вы можете указать, какие отношения следует загружать с помощью метода with:

Я предполагаю, что у вас уже есть hasMany отношения между Post и Wi sh моделями

// App\Post Model

public function wishes() {
   return $this->hasMany('App\Wish');
}


// Controller
//...
$boosted = POST::with('wishes')->whereIn('status_id', [4, 5, 6])->where('boosted',1)->get();
$wishesIDsToUpdate = [];    
foreach ($boosted as $index => $item) {
     if ($item->boosted_until < Carbon::now()) {
       foreach($item->wishes as $wish) {
             $wishesIDsToUpdate[] = $wish->id;
       }
     }                  
}

if(!empty($wishesIDsToUpdate)) {
  Wish::whereIn('id', $wishesIDsToUpdate)->update(['boosted' => 0]);
}
1 голос
/ 20 января 2020

Я думаю, проблема в том. Это огромный объем данных, который может вызвать ошибку времени выполнения. Я предлагаю вам использовать очереди в laravel https://laravel.com/docs/6.x/queues для запуска в фоновом режиме. Вы можете разделить их на части. Например, вы собираетесь получить 100 000 строк данных. Лучше всего разделить их на части, чтобы работа в очереди работала гладко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...