Merhaba arkadaşlar,
Karmaşık bir sorguda eklenti olarak dahil ettiğim 2 sorguyu da ana sorguya dahil etmek istiyorum ama çözüm üretemedim. Bu tarzda bir kullanım yapan var ise yardımcı olabilir mi ?
Öncelikle yapmak istediğim durumu basitçe örneklemeye çalışacağım.
Ürün tablosu : id , siteID , diğer bilgiler
Entegrasyon tablo eşleştirme tablosu : id , integrationID , name
{Entegrasyon tablo eşleştirme tablo değeri} : id , hProductID , diğer bilgiler
siteID ve integrationID sorguya başlamadan önce request olarak geliyor.
Ürün tablosundan sitedeki verileri sorgulayıp , entegrasyon tablo eşleştirme tablosundan tabloyu tespit edip bu tabloda da ürün tablosundaki id değerinin bu tablodaki hProductID kısmında olup olmadığının kontrolünün yapılması.
Şu anda yaptığım sorgu ise şudur:
$controlProductList = [];
if ($platformStatus > 0) {
$database_control_table_mappings = TableMappings::where('integrationID', $this->integrationID)
->get();
if ($database_control_table_mappings->isNotEmpty()) {
$databaseName = $database_control_table_mappings[0]->name;
} else {
$databaseName = null;
$this->error = true;
}
$database_control_other_table_data = DB::table($databaseName)
->where('mProductStatus', MarketplaceApproveStatus::getKey(MarketplaceApproveStatus::Approved))
->get('hProductID');
if ($database_control_other_table_data->isNotEmpty())
{
foreach ($database_control_other_table_data as $control_other_table_item)
{
$controlProductList[] = $control_other_table_item->hProductID;
}
}
}
$database_control_product = Product::where('siteID', $this->siteID);
if ($platformStatus > 0) {
if ($platformStatus == 1) {
$database_control_product = $database_control_product->whereIn('id', $controlProductList);
} else {
$database_control_product = $database_control_product->whereNotIn('id', $controlProductList);
}
}
if ($matchStatus == 1) {
$database_control_product = $database_control_product->withWhereHas(
Str::replace(' ', '', Str::lower($this->platform)) . 'ProductTask');
} elseif ($matchStatus == 2) {
$database_control_product = $database_control_product->doesntHave(
Str::replace(' ', '', Str::lower($this->platform)) . 'ProductTask');
} else {
$database_control_product = $database_control_product->with(
Str::replace(' ', '', Str::lower($this->platform)) . 'ProductTask');
}
$database_control_product = $database_control_product->with(
Str::replace(' ', '', Str::lower($this->platform)) . 'PriceSettings',
function ($query) {
$query->where('status', 1);
})
->when(!empty($this->platformModels->productBrandMappingsModel), function ($query) {
$query->with(Str::replace(' ', '', Str::lower($this->platform)) . 'BrandMappings', function ($query) {
$query->where('status', 1);
});
})
->when($listActiveProduct, function ($query) {
$query->where('productStatus', 1);
})
->with('productAttribute1')
->with('productAttribute2')
->with('productAttribute3');
if ($errorStatus == 1) {
$database_control_product = $database_control_product->where(function ($query) use ($search) {
$query->whereHas('productLog', function ($query) {
$query->where('integrationID', $this->integrationID);
})->orWhereHas('variationLog', function ($query) {
$query->where('integrationID', $this->integrationID);
});
})->with(['productLog' => function ($query) {
$query->where('integrationID', $this->integrationID);
}, 'variationLog' => function ($query) {
$query->where('integrationID', $this->integrationID);
}]);
} elseif ($errorStatus == 2) {
$database_control_product = $database_control_product->where(function ($query) {
$query->whereDoesntHave('productLog', function ($query) {
$query->where('integrationID', $this->integrationID);
})->whereDoesntHave('variationLog', function ($query) {
$query->where('integrationID', $this->integrationID);
});
});
} else {
$database_control_product = $database_control_product->with('productLog', function ($query) {
$query->where('integrationID', $this->integrationID);
})->with('variationLog', function ($query) {
$query->where('integrationID', $this->integrationID);
});
}
if ($salesStatus == 1) {
$database_control_product = $database_control_product->where(
Str::replace(' ', '', Str::lower($this->platform)) . 'SalesStatus',
1);
} elseif ($salesStatus == 2) {
$database_control_product = $database_control_product->where(
Str::replace(' ', '', Str::lower($this->platform)) . 'SalesStatus',
0);
}
$database_control_product = $database_control_product
->when($search, function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where('siteID', $this->siteID);
$query->where('barcode', 'like', $search);
});
$query->orWhere(function ($query) use ($search) {
$query->where('siteID', $this->siteID);
$query->where('productCode', 'like', $search);
});
$query->orWhere(function ($query) use ($search) {
$query->where('siteID', $this->siteID);
$query->where('productName', 'like', $search);
});
});
});
$totalCount = $database_control_product->count();
$database_control_product = $database_control_product
->when(true, function ($query) use ($sortFormat, $orderColumn) {
if ($sortFormat == 'asc') {
if ($orderColumn == 2) {
$queryStr = $query->orderBy('productCode');
} elseif ($orderColumn == 3) {
$queryStr = $query->orderBy('productName');
} elseif ($orderColumn == 5) {
$queryStr = $query->orderBy('varyantProductCode');
} elseif ($orderColumn == 6) {
$queryStr = $query->orderBy('productStatus');
} else {
$queryStr = $query->orderBy('id');
}
} else {
if ($orderColumn == 2) {
$queryStr = $query->orderByDesc('productCode');
} elseif ($orderColumn == 3) {
$queryStr = $query->orderByDesc('productName');
} elseif ($orderColumn == 5) {
$queryStr = $query->orderByDesc('varyantProductCode');
} elseif ($orderColumn == 6) {
$queryStr = $query->orderByDesc('productStatus');
} else {
$queryStr = $query->orderByDesc('id');
}
}
return $queryStr;
})
->when($length, function ($query) use ($start, $length) {
return $query->skip($start)->take($length);
})
->get();
İlk kısımdaki yaptığım işlemi tek sorguya indirgemeye çalışıyorum. Bu ne kadar mümkün bilmiyorum. SQL üzerinden de hareket etmeye çalıştım ama tam sql kodunu çıkaramadım. Yukarıdaki durumu SQL açısından da sunabilecek varsa çok faydalı olur.