У меня есть система, которая должна получить запись из 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
}
}
}