Показване на под категории и продуктите им на една страница

vinsbg

Registered
Здравейте,

Някаква идея как мога да го направя това. Искам да направя следното:
Когато отворя главната категория да ми зареди всички под-категории, които са добавени в нея и под всяка да ми зареди продуктите от нея:
Код:
Главна категория
    ----------------
    - Под Категория 1
       - Продукт 1 в Под Категория 1
       - Продукт 2 в Под Категория 1
    ----------------
    - Под Категория 2
       - Продукт 1 в Под Категория 2
       - Продукт 2 в Под Категория 2
    ...и т.н.
На една страница.. Изглежда имам проблем с логиката на базата и заявката.
Имам таблица Products с колони - category_id, sub_category_id
Имам и таблица sub_category с колони - sub_category_id, category_id

В момента като добавям продукт му записвам в коя категория и под категория е ( id-тата ), но в таблицата sub_category получава

Код:
sub_cat_id    category_id sub_cat_name
       1                       1             Под Категория 1
       2                       1             Под Категория 2

Когато ги показвам на страницата виждам това
Код:
Главна категория
    ----------------
    - Под Категория 1
       - Продукт 1 в Под Категория 1
       - Продукт 2 в Под Категория 1
    ----------------
    - Под Категория 1
       - Продукт 1 в Под Категория 2
       - Продукт 2 в Под Категория 2
    ...и т.н.

Името на Под Категорията е едно и също.. По-скоро логически ми се струва, че грешно ги запазвам, защото луупва category_id-то, а то в случая е едно и също category_id=1...

Но как мога да ги разделя според продуктите...
 
anonimen каза:
Когато ги показвам на страницата виждам това
Явно изкарваш category_id вместо sub_cat_id. Провери си кода на outputa.
Ами да.. заявката е
$info = SubCategories::where('category_id', '=', $categoryId)->get();
Защото аз нали натискам на Категория 1 и според нейното ID ( В случая 1 ) селектирам всички под категории, които са добавени към Категория с ID=1..
 
Ами трябваше да започнеш с това , че ползваш Laravel.
Аз бих ти предложил да направиш просто една колона parent_id и този ред да сочи ид-то на родителската категория, иначе трябва да правиш отделна таблица за да ги линкваш.

След това трябва направиш relationship и да го сложиш в Category класа си.

PHP:
public function children()
{
  return $this->hasMany("App\Models\Category", 'parent_id', 'id');
}

public function scopeMain($q)
{
  return $q->where('parent_id','=', '0')->get();
}
И при извеждането става просто:
PHP:
$cats = Category::main();

@foreach($cats as $cat)
    {{ $cat->title}} 
   @if( count($cat->children))
     @foreach($cat->children as $subcat) 
        {{ $subcat->title}} <br/>
    @endforeach
  @endif
<hr>
@endforeach

Това е примерен код, не съм го тествал, може да трябва да се пипне нещо, но би трябвало да работи, ползвам съм този модел и работи без отказно и спестява допълнителни таблици и сложни заявки :) :?:

П.с. Казвайте, че полазвате фреймуорк, кой фреймуорк, и какво точно искате, защото някой пич щеше да ти изтръска една sql заявка и ти щеше да се чудиш кво да я правиш. Като обясните всичко, много по-лесно ще ви отговорят пичовете от форума :)
 
joTunkiq каза:
Ами трябваше да започнеш с това , че ползваш Laravel.
Аз бих ти предложил да направиш просто една колона parent_id и този ред да сочи ид-то на родителската категория, иначе трябва да правиш отделна таблица за да ги линкваш.

След това трябва направиш relationship и да го сложиш в Category класа си.

PHP:
public function children()
{
  return $this->hasMany("App\Models\Category", 'parent_id', 'id');
}

public function scopeMain($q)
{
  return $q->where('parent_id','=', '0')->get();
}
И при извеждането става просто:
PHP:
$cats = Category::main();

@foreach($cats as $cat)
    {{ $cat->title}} 
   @if( count($cat->children))
     @foreach($cat->children as $subcat) 
        {{ $subcat->title}} <br/>
    @endforeach
  @endif
<hr>
@endforeach
В случая не сметнах, че има значение дали е фреймуърк или не, защото не ми е проблема в него, а чисто логически и структуриране на нещата, но приемам и ще го имам в предвид за в бъдеще. Така по твоя отговор..

Всъщност да.. така става, но сега пък виждам двойни резултати.. как мога да ги направя по един?
 
Виждам ги така.. с двойни имена на подкатегориите.
Код:
Главна категория
    ----------------
    - Под Категория 1
    - Под Категория 2
       - Продукт 1 в Под Категория 1
       - Продукт 2 в Под Категория 1
    ----------------
    - Под Категория 1
    - Под Категория 2
       - Продукт 1 в Под Категория 2
       - Продукт 2 в Под Категория 2
    ...и т.н.
А би трябвало да е
Код:
Главна категория
    ----------------
    - Под Категория 1

       - Продукт 1 в Под Категория 1
       - Продукт 2 в Под Категория 1
    ----------------
    - Под Категория 2

       - Продукт 1 в Под Категория 2
       - Продукт 2 в Под Категория 2
    ...и т.н.
 
В случая не сметнах, че има значение дали е фреймуърк
Има защото както казах, няма да е точен отговора. Както и да е.

Видях, че имаш някакви пролета за подкатегории и категории и ми изглежда .. малко ... батак. За това ти предложих този метод.

Относно въпроса къде да сложиш функциите съм ти го написал, нищо че си редактира мнението. Казах също и че не съм го пробвал и може да се наложи да се пипне.

П.с. Не виждам разлика в последния ти пост за това как ги виждаш, в единия вариянт показва всичко, дори и да няма продукти в подкатегорията, в твоя - показва само тези, които имат продукти. Ако това искаш - еми направи още един relationship за продуктите и готово. :D :?:
 
joTunkiq каза:
П.с. Не виждам разлика в последния ти пост за това как ги виждаш, в единия вариянт показва всичко, дори и да няма продукти в подкатегорията, в твоя - показва само тези, които имат продукти. Ако това искаш - еми направи още един relationship за продуктите и готово. :D :?:
Дублира имената на под-категориите.

Също така това
Код:
	public function scopeMain($q)
	{
	  return $q->where('sub_cat_id','=', '0')->get();
	}
Тази нула как ще стане динамична в модела?
 
Нагледано, какво се получава и какво се опитвам да избегна. Задрасканите имена и описания не трябва да се показват.
6819.jpg
 
Виж сега, или трябва да ползваш моя модел или твоя, защото ако се опитваш да правиш и двата ще сработи обаче не съм отговорен за бъговете.

Идеята е parent_id да се записва ИД-то на родителската катеогория, както вече казах, следователно ако е празно или ако е 0 (за по-лесно) значи е главна категория.

Не е нужно да се съгласяваш с мен или да не пробваш и други методи.
Ето например това -> https://laracasts.com/discuss/channels/laravel/create-a-nested-lists-of-categories-in-laravel-5?page=1
Подобно е, ако ти е по-лесно така, пробвай него :) :idea: :?:

Едит: нещо си не тие наред в модела или изкарването, дай си модела и да видя във view-то как се изкарва :)
 
Това ми е модела ( твоя пример леко преправен ) и когато е така '0' не изкарва нищо.. само продуктите. Ако му сложа 1 изкарва всички, които имат sub_cat_id = 1 в dual_sub_category
Код:
    public function subcategory()
    {
        return $this->hasMany('SubCategories', 'sub_cat_id', 'dual_sub_cat_id');
    }
    
    public function scopeMain($q)
    {
	  return $q->where('sub_cat_id','=', '0')->get();
    }  
    public function products()
    {

       return $this->hasMany('Product', 'dual_sub_cat_id');
    }
Това ми е view-то
Код:
@if($dual_products->count())
	    
		@foreach($dual_products->products as $i => $product)	
			@foreach($dual as $dual_info)
				<h3>{{ $dual_info['dual_sub_cat_name'] }} ID -  {{ $dual_info['dual_sub_cat_id'] }}</h3>
				<div class="pull-right"><a class="c-img c-img-lg" href="#"><img src="{{ $dual_info['dual_sub_cat_image'] }}"></a></div>
				<hr />
				<p>{{ $dual_info['dual_sub_cat_desc'] }}</p><br/>
			@endforeach
	
		<hr />
	        <div class="row">
	        <div class="table-responsive">
	            <table class="table table-bordered">
	                <thead>
	                </thead>
	                <tbody>   
		            	            
		                
		                    <tr>
		                        <td>{{ $product['product_id'] }}</td>
		                        <td>{{ $product['title'] }}</td>
		                        <td>Price: <strong>${{ $product['price']}}</strong></td>	                        
		                        <td>{{ $product['description_small'] }}</td>	                      
		                        <td><a href="{{ URL::to('/cart/add/' . $product['product_id']) }}?_token={{ csrf_token() }}" class="btn btn-primary">Add to cart</a></td>
		                    </tr>
		                
		                    
	                </tbody>
	            </table>
	        </div>
	        @endforeach
	        <hr />
	    </div> 
	
@else
 //

Това ми е таблицата за dual_sub_cat
6820.jpg


А това е sub_category таблицата. Общото sub_cat_id
6821.jpg


controllera-
Код:
    public function showCategoryInfo($subcatId) {
	
	$dual = DualSubCategories::main();
	$dual_products = DualSubCategories::with('products')->groupBy('sub_cat_id')->findOrFail( $subcatId );	

            return View::make('site.subcategory', [
                'dual' => $dual,
                'dual_products' => $dual_products
            ]);
    }
Явно съм омешал нещо доста...
 
Fakeheal каза:
Код:
NULL

Не 0, не празно - null.

null означава навсякъд едно и също, нулата или празното - не.
Ако имаш в предвид да го променя на
Код:
return $q->whereNotNull('sub_cat_id')->get();
Така изкарва всичко на една страница.. без значение от id-тата и в коя под-категория се намирам..
 
vinsbg каза:
Fakeheal каза:
Код:
NULL

Не 0, не празно - null.

null означава навсякъд едно и също, нулата или празното - не.
Ако имаш в предвид да го променя на
Код:
return $q->whereNotNull('sub_cat_id')->get();
Така изкарва всичко на една страница.. без значение от id-тата и в коя под-категория се намирам..

Имам впредвид нормализацията на информацията в DB-то. :)
 
В случая проблема ми е, че имам няколко под-категории при които sub_cat_id е еднакво понеже принадлежат към нея.. Може би във вюто нещо лууповете трябва да променя, за да не ми ги показва по този начин..
 
Нещо ти се бърка логиката, а кода, определено си го омазал ;д

Ето, запвядай, моля, изгледай, pls asl :D https://www.youtube.com/watch?v=NQMmrqASZjQ - Това е "ПРАВИЛНИЯ" начин с many-to-many връзка, в кавички е защото е малко обширен, а моя вариант е доста сбит и работи. Щом ти е труднно да схванеш моя вариант, пробвай този, може да ти е по-лесно. :idea: :?:
 
Напиши в phpmyadmin-a или каквото ползваш там:

Код:
SHOW CREATE TABLE `tablicata_kategorii` <- смени това;
Код:
SHOW CREATE TABLE `products` <- смени това;

И пейстни резултата. :)

Моделите за категория и продукт. И вюто, което ползваш в момента. Темата стана доста разхвърляна. :)
 
Fakeheal каза:
Напиши в phpmyadmin-a или каквото ползваш там:

Код:
SHOW CREATE TABLE `tablicata_kategorii` <- смени това;
Код:
SHOW CREATE TABLE `products` <- смени това;

И пейстни резултата. :)

Моделите за категория и продукт. И вюто, което ползваш в момента. Темата стана доста разхвърляна. :)
Всички модели за трите категории, view-то, контролера и таблиците:
 

Back
Горе