Laravel L oop через значение массива и обновление пользователей - PullRequest
0 голосов
/ 09 апреля 2020

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

Вот мой полный код

public function checkpaysub(Request $request) {
  $userss = User::all()->pluck('email');
  //dd($userss);
  foreach($userss as $users) {
    $email = $users;

  //$ref= $request->reference_code;
  $url= 'https://api.paystack.co/customer/';
  $url .= $email;
  //dd($url);

  $client = new Client();
  $response = $client->request('GET', $url, [
    'headers' => [
      'Authorization' => 'Bearer '.'##################',
    ],

  ]);

  $statusCode = $response->getStatusCode();
  $body = json_decode($response->getBody()->getContents());
  $sub_cus = $body->status;
  $sub_status = $body->data->subscriptions[0]->status;
  $sub_email = $body->data->email;
  $user_exist = User::where('email', $sub_email)->exists();

  if(($body->status == 'true') && $user_exist && $sub_status){
     $user = User::where('email', $sub_email)->first();
     $user->sub_status = $sub_status;
     $user->save();
     $users = new UserResource(User::where('email', $sub_email)->first());

     return response()->json(array(
      'user' => $users
  ));

   }
   elseif (($body->status == 'true') && $user_exist) {
    $user = User::where('email', $sub_email)->first();
    $user->sub_status = "inactive";
    $user->save();
    $users = new UserResource(User::where('email', $sub_email)->first());
    return response()->json(array(
      'user' => $users
    ));
    }
  }
}

}

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Это может быть значительно переработано, чтобы быть намного проще:

$client = new Client();
$usersWithUpdatedSubscriptions = collect();

User::chunk(100, function ($users) use ($client, $usersWithUpdatedSubscriptions) {
    foreach($users as $user) {
        $response = $client->request('GET', "https://api.paystack.co/customer/$user->email", [
            'headers' => [
                'Authorization' => 'Bearer '.'##################',
            ],
        ]);

        $body = json_decode($response->getBody()->getContents());

        if ($body->status == 'true') && $user->email === data_get($body->data, 'email', null)) {
            $user->update([
                'sub_status' => data_get($body->data->subscriptions, '0.email', null) ?? 'inactive' 
            ]);

            $usersWithUpdatedSubscriptions->push(new UserResource($user));
        }
    }
});

return response()->json(array(
    'user' => $usersWithUpdatedSubscriptions->toArray()
));

То, что мы здесь делаем:

  • chunking, чтобы гарантировать, что мы освободим часть памяти.
  • переместил экземпляр client за пределы loop, поэтому мы не тратим ресурсы на повторное создание.
  • создал простой массив для хранения ссылок на наших пользователей, в который мы можем добавить sh.
  • сокращенные избыточные запросы
  • с использованием null coalescing для упрощения определения c sub_status logi c
  • переместил return за пределы l oop
1 голос
/ 09 апреля 2020

, потому что у вас есть return в foreach, так что это будет только l oop один раз.

public function checkpaysub(Request $request) {
    $userss = User::all()->pluck('email');

    $returnedUsers = collect([]);

    foreach($userss as $users) {
      $email = $users;

    $url= 'https://api.paystack.co/customer/';
    $url .= $email;

    $client = new Client();
    $response = $client->request('GET', $url, [
      'headers' => [
        'Authorization' => 'Bearer '.'##################',
      ],

    ]);

    $statusCode = $response->getStatusCode();
    $body = json_decode($response->getBody()->getContents());
    $sub_cus = $body->status;
    $sub_status = $body->data->subscriptions[0]->status;
    $sub_email = $body->data->email;
    $user_exist = User::where('email', $sub_email)->exists();

    if(($body->status == 'true') && $user_exist && $sub_status){
       $user = User::where('email', $sub_email)->first();
       $user->sub_status = $sub_status;
       $user->save();
       $users = new UserResource(User::where('email', $sub_email)->first());

       $returnedUsers->push($users);

     }
     elseif (($body->status == 'true') && $user_exist) {
      $user = User::where('email', $sub_email)->first();
      $user->sub_status = "inactive";
      $user->save();
      $users = new UserResource(User::where('email', $sub_email)->first());
      $returnedUsers->push($users);
      }
    }

    return response()->json(array(
        'user' => $returnedUsers->all()
    ));
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...