Как я могу проверить все данные, если не ошибка, а затем обновить базу данных с Laravel - PullRequest
0 голосов
/ 06 ноября 2018

Привет. Я хочу проверить все данные, если в id нет ошибок, тогда я хочу обновить данные.

dd($data) output like this :

0 => array:3 [▼
    "id" => "1"
    "target" => "100"
  ],
1 => array:3 [▼
    "id" => "2"
    "target" => "200"
]


    for ($i = 0; $i < count($data); $i ++)
    {
        $user = User::findOrfail($data[$i]['id']);
        $user->target = $data[$i]['target'];
        $user->save();
    }

Я хочу сделать что-то подобное

    for ($i = 0; $i < count($data); $i ++)
    {
        $user = User::findOrfail($data[$i]['id']);
        if(!user) {
            die('somethings error');
        }
    }

    for ($i = 0; $i < count($data); $i ++)
    {
        $user = User::findOrfail($data[$i]['id']);
        $user->target = $data[$i]['target'];
        $user->save();
    }

Как вы видите, таким образом каждый цикл работы вначале проверяет все $ user, затем циклически обновляет пользователя. но я думаю, что это плохой способ использовать цикл 2 для одной и той же переменной. Как я могу сделать что-то подобное с красивым кодом

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

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

Вы можете выполнить проверку в классе запроса формы. Это особые экземпляры запросов, которые вы можете добавить к действиям контроллера и будут выполняться перед вашими действиями. Если проверка не пройдена, пользователь перенаправляется обратно с сообщениями об ошибках до действия вашего контроллера.

Подробнее о проверке запроса формы можно прочитать в официальной документации Laravel: https://laravel.com/docs/master/validation#form-request-validation

0 голосов
/ 06 ноября 2018
$user = User::findOrfail($data[$i]['id']);

Это выдаст Illuminate\Database\Eloquent\ModelNotFoundException, если модель не найдена, поэтому ваш первый цикл не нужен.

Таким образом, вы можете без проблем использовать только секундную петлю.

Если исключение не перехвачено, ответ 404 HTTP автоматически отправляется обратно пользователю. Нет необходимости писать явные проверки для возврата 404 ответов при использовании этих методов

См. Здесь: Документация Laravel

Имейте в виду, что eiter die или ModelNotFoundException останавливает цикл. Таким образом, каждый элемент массива после первого кристалла не будет обновлен.

0 голосов
/ 06 ноября 2018

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

вы начинаете транзакцию, идете обычным способом спасения пользователей, и, если происходит ошибка, просто выведите исключение и откатите всех сохраненных пользователей.

DB::beginTransaction();
try{
  for ($i = 0; $i < count($data); $i ++)
    {
      $user = User::findOrfail($data[$i]['id']);
      if (!$user){
        throw new Exception();
      }
      $user->target = $data[$i]['target'];
      $user->save();
    }
  DB::commit();
} catch(Exception $e){
  DB::rollback();
}
0 голосов
/ 06 ноября 2018

Вы пытались объединить два в одно:

for ($i = 0; $i < count($data); $i ++)
{
    // use just find as it returns null, findOrFail will throw an exception if the user is not found
    $user = User::find($data[$i]['id']);
    if(!user) {
        // you can use continue; which will skip the current iteration, and collect the errors.
        die('somethings error');
    }
    // this code will not execute if the user is not found
    $user->target = $data[$i]['target'];
    $user->save();

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