Запрос внутри foreach l oop альтернатива - PullRequest
0 голосов
/ 04 мая 2020

У меня есть система, которая должна получить запись из 2 таблиц и создать новую запись в другой таблице. Я использую запрос select внутри foreach l oop, что делает его очень медленным, когда таблица увеличивается. Есть ли альтернатива?

Код показан ниже:

$sellIds = Sell::whereStatusCode(Globals::STATUS_WAITING)->wherePackageId($packageDB->id)->whereCountryId($c->id)->orderBy("created_at")->get();

$sellCount = Sell::whereStatusCode(Globals::STATUS_WAITING)->wherePackageId($packageDB->id)->whereCountryId($c->id)->count();                   
$buyIds = Buy::where(["status_code" => Globals::STATUS_WAITING, "country_id" => $c->id, "package_id" => $packageDB->id])->orderByRaw("RAND()")->take($sellCount)->lists("id");
$buyId = implode(',',$buyIds);

$i = 1;
if($buyIds){
foreach ($sellIds as $sellDB) {
    $identicalSellerContactIds = Distributor::whereIc($sellDB->distDB->ic)->lists("id");
    $buyDB = Buy::whereRaw("id in (".$buyId.")")->whereStatusCode(Globals::STATUS_WAITING)->whereNotIn("dist_id", $identicalSellerContactIds)->first(['id', 'dist_id', 'country_id']);
    if(!$buyDB){
        $buyDB = Buy::where(["status_code" => Globals::STATUS_WAITING, "country_id" => $c->id, "package_id" => $packageDB->id])->whereNotIn("dist_id", $identicalSellerContactIds)->first(['id', 'dist_id', 'country_id']);
    }
    if ($buyDB && $sellDB) {
        // create 1 table
        // update 2 table
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...