Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
merhaba sınırsız alt kategori oluşturmak istiyorum. bu kodu nasıl duzenleye bilim?
yalnız ana kategori ve birde alt kategori mövucud.



<?php

namespace App\Http\Controllers\Categories;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use DB;
use App\Models\Ad;
use App\Models\Category;
use Carbon\Carbon;
use Helper;
use SEO;
use SEOMeta;
use Protocol;
use Theme;

/**
* CategoriesController
*/
class CategoriesController extends Controller
{
public $theme = '';

function __construct()
{
$this->theme = Theme::get();
}

/**
* Get Categories
*/
public function category(Request $request, $parent, $sub=null)
{
// Check category
$parent_category = DB::table('categories')->where('category_slug', $parent)->where('is_sub', false)->first();

if ($parent_category) {

if ($sub) {

// Check sub category
$sub_category = DB::table('categories')->where('category_slug', $sub)->where('parent_category', $parent_category->id)->first();

if ($sub_category) {

// Get filters
$date = $request->get('date');
$status = $request->get('status');
$condition = $request->get('condition');

// Check Date
if ($date) {

switch ($date) {
case 'today':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereRaw('Date(created_at) = CURDATE()')->orderBy('id', 'desc')->paginate(30);
break;
case 'yesterday':
$yesterday = date("Y-m-d", strtotime( '-1 days' ) );
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereDate('created_at', $yesterday )->orderBy('id', 'desc')->paginate(30);
break;
case 'week':
$fromDate = Carbon::now()->subDays(8)->format('Y-m-d');
$tillDate = Carbon::now()->format('Y-m-d');
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereBetween( DB::raw('date(created_at)'), [$fromDate, $tillDate] )->orderBy('id', 'desc')->paginate(30);
break;
case 'month':
$fromDate = Carbon::now()->subDays(31)->format('Y-m-d');
$tillDate = Carbon::now()->format('Y-m-d');
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereBetween( DB::raw('date(created_at)'), [$fromDate, $tillDate] )->orderBy('id', 'desc')->paginate(30);
break;
case 'year':
$fromDate = Carbon::now()->subDays(366)->format('Y-m-d');
$tillDate = Carbon::now()->format('Y-m-d');
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereBetween( DB::raw('date(created_at)'), [$fromDate, $tillDate] )->orderBy('id', 'desc')->paginate(30);
break;

default:
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);
break;
}

}elseif ($status) {

switch ($status) {
case 'featured':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_featured', 1)->orderBy('id', 'desc')->paginate(30);
break;
case 'normal':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_featured', 0)->orderBy('id', 'desc')->paginate(30);
break;

default:
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);
break;
}

}elseif ($condition) {

switch ($condition) {
case 'used':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_used', 1)->orderBy('id', 'desc')->paginate(30);
break;
case 'new':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_used', 0)->orderBy('id', 'desc')->paginate(30);
break;

default:
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);
break;
}

}else{

// Get Ads
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);

}

// Get Stores
$stores = DB::table('stores')->where('category', $sub_category->id)->where('status', 1)->orderByRaw('RAND()')->take(10)->get();

// Send data
$data = array(
'ads' => $ads,
'sub' => $sub,
'parent' => $parent,
'stores' => $stores,
);

// Get Tilte && Description
$title = Helper::settings_general()->title;
$long_desc = Helper::settings_seo()->description;
$keywords = Helper::settings_seo()->keywords;

// Manage SEO
SEO::setTitle($sub_category->category_name.' | '.$title);
SEO::setDescription($long_desc);
SEO::opengraph()->setUrl(Protocol::home().'/category/'.$parent.'/'.$sub);
SEOMeta::addKeyword([$keywords]);

return view($this->theme.'.categories.category')->with($data);

}else{
// Not found
return abort(404);
}

}else{

// Get Parent category sub categories
$sub_categories = Category::where('parent_category', $parent_category->id)->where('is_sub', 1)->get();

// Get latest ads
$latest_ads = Ad::where('status', 1)->where('is_archived', 0)->where('is_trashed', 0)->where('category', $parent_category->id)->orderBy('id', 'desc')->paginate(20);

// Get Tilte && Description
$title = Helper::settings_general()->title;
$long_desc = Helper::settings_seo()->description;
$keywords = Helper::settings_seo()->keywords;

// Manage SEO
SEO::setTitle($parent_category->category_name.' | '.$title);
SEO::setDescription($long_desc);
SEO::opengraph()->setUrl(Protocol::home().'/category/'.$parent);
SEOMeta::addKeyword([$keywords]);

return view($this->theme.'.categories.parent')->with([
'sub_categories' => $sub_categories,
'parent_category' => $parent_category,
'latest_ads' => $latest_ads,
]);

}

}else{
// Not found
return abort(404);
}
}

}
Adjacency list dediğimiz, ebevyn-çocuk hiyerarşisini çocuk içerisinde ebevyn id'si tutarak (sizde parent_category alanı) kuran bir sistem kullanıyor. Kategori eklerken sınırsız kategori ekleyebilmeniz gerekiyor zaten.
Cevabınız için teşekkür ederim.
Asıl sorun, alt kategori altında alt kategoriler oluşturamam.
Bu sorunu nasıl çözebilirim?
Lütfen yardım edin.
// Önce alt kategoriyi çekiyorsunuz. Örneğin:
$slug = 'ornek-alt-kategori';
$sub = DB::table('categories')->where('category_slug', $slug)->where('is_sub', true)->first();

// Daha sonra buna alt kategori ekliyorsunuz
$newSub = DB::table('categories')->insert([
 'is_sub' => true,
 'name' => 'Yeni alt kategori',
 'slug' => 'yeni-alt-kategori',
 'parent_category' => $sub->id // Bu kısıma üst kategorinin id'si işleniyor.
]);
Burada sizin yazdığınız koddan Builder ile hazırladım. Eğer kategori için model varsa onunla daha kolay olacaktır:
$category = Category::where('category_slug', $slug)->where('is_sub', true)->first();
$newSub = $category->children()->create([
 'is_sub' => true,
 'name' => 'Yeni alt kategori',
 'slug' => 'yeni-alt-kategori',
]);
gibi.


Ek olarak:
Adjacency list üzerinde kolay işlemler yapmak için, örneğin çocukları getir, tüm alt kategorileri getir vs... gibi, şu kütüphaneyi kullanabilirsiniz:
https://github.com/BlueM/Tree

Sizin yapınıza göre şöyle olabilir:
$categories = DB::table('categories')->select(['id','name','slug','parent_category'])->get()->toArray();

$tree = new BlueM\Tree($categories,[
 'rootId' => null, // burada ana (kök) kategorilerin parent_category değerini null varsayıyorum. Eğer 0 olarak tutuluyorsa 0 yazacaksınız
 'id' => 'id',
 'parent' => 'parent_category'
]);

// $categories değerinin şöyle bir yapı olduğunu farzedin:
/*
[
 ['id' => 1, 'parent_category' => 0, 'name' => 'Bilgisayar'],
 ['id' => 2, 'parent_category' => 1, 'name' => 'Dizüstü'],
 ['id' => 3, 'parent_category' => 2, 'name' => 'Oyuncu Dizüstü'],
];
*/

$node = $tree->getNodeById(3);
$nodeAndAncestors = array_reverse($node->getAncestorsAndSelf());

$breadcrumbs = '<ol>';
foreach ($nodeAndAncestors as $ancestor) {
 $breadcrumbs .= '<li><a href="'.route('category', $ancestor->get('slug')).'">'.$ancestor->get('name').'</a></li>';
}
$breadcrumbs .= '</ol>';

/*
<!-- Örnek çıktı -->
<ol>
 <li><a href="/kategori/bilgisayar">Bilgisayar</a></li>
 <li><a href="/kategori/dizustu">Dizüstü</a></li>
 <li><a href="/kategori/oyuncu-dizustu">Oyuncu Dizüstü</a></li>
</ol>
*/
Kodlar için teşekkürler.
E-posta adresinize yazdım.
E-posta mesajına cevap verebilir misiniz?
Benim E-posta adresim yzadehs@gmail.com
Cevapladım ama forum üzerinden yazarsanız sevinirim. Benzer sorunlar yaşayan arkadaşlara da bir faydası dokunur.