Merhaba,
Umarım herkes iyidir ve işleri yolundır. 🙂
Laravel dünyasında yeni sayılırım ve eloquent ile ilgili bir sorum var.
Kategori ve ürünler olarak 2 tablom mevcut.
X kategorisiyle birlikte alt kategorilerin alıp, tüm bu kategorilerin de ürünler tablosundan kategori_id'ye göre WHERE IN kullanarak ürünleri çekmek istiyorum fakat sorgu sayısı 1. YÖNTEM'de çok fazla olduğu için performanslı değil.
O yüzden bu durumu MySQL'de çözmek istedim ve 2. YÖNTEM'i oluşturdum. Bu yöntem güzel çalışıyor, SET @cat... ile başlayan değişkene manuel olarak phpmyadmin'de değer girince istediğim sonuçları alıyorum fakat Laravel'de bu sorguyu 2. YÖNTEM'deki gibi yazdığımda "General error: 1 near "SET": syntax error " ile başlayan bir hata alıyorum ve bir türlü çözmedim doğrusu. Stackoverflow vb. platformlarda syantax'dan kaynaklı olarak düşündüğüm önerileri de yazdığımda sonuç değişmedi. Bu konuda yardımınıza ihtiyacım var, şimdiden çok teşekkür ederim.
İyi çalışmalar dilerim.
1. YÖNTEM
Controller:
getProducts($node_id) {
$cats = Category::where('id', $cat_id)->with('recursiveChildren')->get();
$cats = collect($cats)
->map($closure = function($item) use (&$closure) {
return [$item->id, collect($item->children)->map($closure)->all()];
})
->flatten()
->sort()
->values()
->all();
$products = Product::whereIn('cat_id', $cats)->paginate(10);
}
Model:
public function children()
{
return $this->hasMany(self::class, 'parent_id');
}
public function recursiveChildren()
{
return $this->children()->with('recursiveChildren');
}
2. YÖNTEM
DB::statement("SET @cat = " . $cat_id);
$products = DB::table('products')->whereRaw("
cat_id IN (
SELECT id FROM categories
WHERE FIND_IN_SET(parent_id, @cat) AND !isnull(@cat:= concat(@cat, ',', id)) OR id = " . $cat_id . "
ORDER BY parent_id
)
")->paginate(10);