Я хочу сравнить прогнозы пользователей с фактическими результатами матчей. Если прогноз окажется верным, столбец result будет обновлен до true в моей таблице прогнозов. Я использую коллекцию для просмотра моих совпадений и updateOrCreate для обновления полей базы данных.
Как я могу правильно добавить оператор if, который проверяет, совпадают ли значения друг с другом?
Код
public function compareScores() {
$matches = $this->getMatches();
collect($matches['match'])
->each(function ($match, $key) {
Prediction::updateOrCreate([
'match_id' => $match['match_id'],
],[
// if ($match['homeScore'] == 'homeScore' && $match['awayScore'] == 'awayScore') {
// 'result' => true
// }
]);
});
}
public function getMatches() {
$finished = Match::all()->where('status', 'FINISHED');
return $finished;
}
Марк - Обычно это хорошее решение, но он не хочет создавать новый прогноз, если значения не совпадают. Он просто хочет их обновить.
Разве прогноз не будет зависеть от match_id И user_id? Прямо сейчас вы показываете код, который предполагает, что существует только один прогноз на совпадение. Разве у вас не было бы много прогнозов на матч?
Я хочу добиться, чтобы каждое предсказание каждого пользователя проверялось. Так что да, в одном матче может быть много прогнозов от разных пользователей. Я не думаю, что идентификатор пользователя имеет значение в этом случае, потому что я проверяю все свои прогнозы, а не только прогноз конкретного пользователя.
Думаю, все, о чем я спрашивал, это о том, есть ли более одного прогноза на матч. Если это так, то ваш оператор updateOrCreate должен иметь более уникальную идентифицирующую информацию, чем просто match_id. Если существует много прогнозов с одним и тем же match_id, все они будут обновляться каждый раз, когда вы его запускаете, независимо от того, какой пользователь сделал прогноз. И окончательный результат будет просто результатом последнего предсказания, которое вы проверили. Имеет ли это смысл?






Думаю, теперь я полностью понимаю. Я бы не рекомендовал updateOrCreate в этом случае. Я бы сделал это так:
public function compareScores() {
$matches = $this->getMatches();
foreach($matches as $match) {
$predictions = Prediction::where('match_id',$match->id)->get();
foreach($predictions as $prediction) {
if ($prediction->homeScore == $match->homeScore && $prediction->awayScore == $match->awayScore ) {
$prediction->result=true;
$prediction->save();
}
}
}
}
Это будет проходить через каждый матч и находить все прогнозы, которые были сделаны для него. Затем он проверит, соответствуют ли прогнозы homeScore и awayScore фактическому счету в матче. Если оба результата совпадают, результат изменится на истинный.
Обратите внимание, что вы можете упростить это еще больше, если правильно настроили отношения между моделями. Затем вы можете удалить строку, в которой вы тянете $ predictions = Prediction :: where ('match_id, $ match-> id) -> get (); Вместо этого вы просто перейдете прямо к циклу foreach и запустите этот код:
foreach($match->predictions as $prediction) {
...
}
Вы пробовали добавить счет дома и счет на выезде к параметрам в updateOrCreate? вот так:
Prediction::updateOrCreate([ 'match_id' => $match['match_id'], 'homeScore' => $match['homeScore'], 'awayScore' => $match['awayScore'] ]