Добавление оператора if в UpdateOrCreate

Я хочу сравнить прогнозы пользователей с фактическими результатами матчей. Если прогноз окажется верным, столбец 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;

}

Вы пробовали добавить счет дома и счет на выезде к параметрам в updateOrCreate? вот так: Prediction::updateOrCreate([ 'match_id' => $match['match_id'], 'homeScore' => $match['homeScore'], 'awayScore' => $match['awayScore'] ]

Marc M. 30.10.2018 20:47

Марк - Обычно это хорошее решение, но он не хочет создавать новый прогноз, если значения не совпадают. Он просто хочет их обновить.

eResourcesInc 30.10.2018 21:01

Разве прогноз не будет зависеть от match_id И user_id? Прямо сейчас вы показываете код, который предполагает, что существует только один прогноз на совпадение. Разве у вас не было бы много прогнозов на матч?

eResourcesInc 30.10.2018 21:04

Я хочу добиться, чтобы каждое предсказание каждого пользователя проверялось. Так что да, в одном матче может быть много прогнозов от разных пользователей. Я не думаю, что идентификатор пользователя имеет значение в этом случае, потому что я проверяю все свои прогнозы, а не только прогноз конкретного пользователя.

Dax 30.10.2018 21:11

Думаю, все, о чем я спрашивал, это о том, есть ли более одного прогноза на матч. Если это так, то ваш оператор updateOrCreate должен иметь более уникальную идентифицирующую информацию, чем просто match_id. Если существует много прогнозов с одним и тем же match_id, все они будут обновляться каждый раз, когда вы его запускаете, независимо от того, какой пользователь сделал прогноз. И окончательный результат будет просто результатом последнего предсказания, которое вы проверили. Имеет ли это смысл?

eResourcesInc 30.10.2018 21:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
268
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, теперь я полностью понимаю. Я бы не рекомендовал 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) { 
    ...
}

Другие вопросы по теме