Заявка от две таблици и показване на резултати с laravel

vinsbg

Registered
Искам да направя нещо, което не знам как точно би станало, още повече с Laravel.

@Fakeheal ми беше помогнала с една функция да извеждам и показвам на страницата категорията и най-ниската цена на продукт в нея.

Сега понеже ще има продукти, които нямат категория искам да показвам всички продукти на страницата, както са си без категория + всички категории ... т.е. всички категории на страницата + всички продукти без категории...

Две таблици са category и products ... общото, което има между тях е category_id. id-то на категорията го запазвам и на продукта, когато е добавен към нея. Когато продукта не е добавен в категория там стои 1 ... Реално аз нямам категория с id=1 ... в селекта 'Без категория' този опшънс е извън луупа и с value='1'..

имам и още една колона в таблицата products - single_product , което по дефолт е 1 ако не е добавен в категория... може би с него ще е по-лесно..

Това ми е Categories модел-а
Код:
class Categories extends Eloquent {
    protected $table = 'category';
    protected $primaryKey = 'category_id';

    public $timestamps = false;

    public function products()
    {
        return $this->hasMany('Product', 'category_id');
    } 

    public function lowestProduct() {

    	return $this->products()->selectRaw('*, max(price) as aggregate')
        ->groupBy('products.product_id')->orderBy('aggregate');
    }
}
Това ми е Product модела

Код:
class Product extends Eloquent {
    protected $table = 'products';
    protected $primaryKey = 'product_id';
    

    public function categories()
    {
        return $this->hasMany('Categories', 'category_id');
    }
    
    public $timestamps = false;
}
А това ми е view-то, където се опитвам да ги покажа всичките

Код:
<div class="col-xs-8 text-left" style="margin-top: 9px">
                             		
         @if ($category->products()->min('single_product') == 1)
                                         
                 Price: <strong>{{ $category->products()->min('price') }} $ </strong>
                               		
        @endif
                                       
                  Price from: <strong>{{ $category->products()->min('price') }} $ </strong> 
 </div>

Помагайте, защото съм се оплел много :)

Това, което мога да кажа е че в момента показва само
Price from: <strong>{{ $category->products()->min('price') }} $ </strong>
</div>
тоест само категориите...

едит: Забравих HomeController-a ако е нужен и той...
Код:
	public function index()
	{
        	$categories = Categories::has('products')
        			->orderBy('category_name', 'ASC')->get();
				return View::make('site.index', [
		            'categories' => $categories
		            
		            
		]); 
	}
 
vinsbg каза:
Мерси, но не разбрах къде да го добавя това?

Най-добре е да го сложиш в контролера и да го подадеш на View-то и след това да си го дисплейнеш там.

Но заявката трябва да е (че съм я объркала):

Код:
DB::table('products')->whereNull('category_id')->min('price');

Като продуктите, имат вместо id на категорията в category_id, null стойност.
 
Fakeheal каза:
Код:
DB::table('products')->whereNull('category_id')->min('price');

Като продуктите, имат вместо id на категорията в category_id, null стойност.
Но аз все пак ще имам и продукти, които са си в категории т.е. category_id няма да е null в никой от случаите..

С това донякъде проработи
Код:
$single = DB::table('products')->where('single_product', 1)->get();
Но получавам на моменти много странен резултат, който не мога да установя все още от къде е.. имам продукти, които са и в категория и не в категория...
 
Fakeheal каза:
Какво е 'single_product'?

vinsbg каза:
имам и още една колона в таблицата products - single_product , което по дефолт е 1 ако не е добавен в категория... може би с него ще е по-лесно..

В случая обаче не е вързана по никакъв начин с категориите тази колона...Просто, когато добавям продукт ако няма да е в категория му избирам - без категория и то запазва 1-ца в тази колона.
 
Това е доста излишно поле.

Просто сетваш category_id в таблицата на продуктите на NULL, когато нямат категория.

И после слагаш:

Код:
$lowestPriceWithoutCategory = DB::table('products')->whereNull('category_id')->min('price');
подаваш променливата на view-то и си я показваш.
 
Fakeheal каза:
Това е доста излишно поле.

Просто сетваш category_id в таблицата на продуктите на NULL, когато нямат категория.

И после слагаш:

Код:
$lowestPriceWithoutCategory = DB::table('products')->whereNull('category_id')->min('price');
подаваш променливата на view-то и си я показваш.
Не съм го пробвал, но тук ще ми трябват два foreach-a във вюто, нали?
Един за категориите и един за продуктите без категории
 
Идеята е да покажа целия продукт. Описание, снимка, цена... В момента са видими само имена на категории.
 
Fakeheal каза:
Искаш да вземеш най-евтиния продукт, който няма категория?
Не. Искам просто да изкарам всички продукти, които нямат категория + всички категории и на категорията да си се покаже най-ниската цена.

В момента показвам всички категории и на всяка категория най-ниската цена. Сега до тях да си покажа и продуктите, които са без категория, като тук вече не ме интересува най-ниската цена, а просто да ги изкарам.
 
Най-ниска цена на продукти без категория:
Код:
DB::table('products')->whereNull('category_id')->min('price');

Продукти без категория:
Код:
DB::table('products')->whereNull('category_id')->get();

Ама продуктите без категория трябва да имат category_id = NULL, махни другото поле.

Или за най-лесно в контролера:

Код:
$productsWithoutCategory = DB::table('products')->whereNull('category_id')->get();

Във view-то:

Код:
foreach($productsWihtoutCategory as $product) {
      //твоя код тук...
}

и за цената:

Код:
$productsWithoutCategory->min('price');
 
Добре, а как да инсъртна NULL в това поле. В смисъл default сега е NULL. То е int и когато създавам продукт си взимам категорията, която е избрана
Код:
$product->category_id = Input::get('category');
Дори и да направя така
Код:
    <div class="form-group">
    <label for="title" class="control-block">Assign Product to Category:</label>
    <select class="form-control" name="category">
    <option value="">Single Product</option>
        @foreach($categories as $categorie)
    	    <option value="{{ $categorie->category_id }}">{{ $categorie->category_name }}</option>
        @endforeach
    </select>
    </div>
И да оставя value="" празно на Single Product то записва 0...

Мисля, че се оправих. Благодаря за помощта отново! :?:

Все пак ще ми е интересно да чуя дали така трябва дае просто value="" празно и в заявката
Код:
DB::table('products')->where('category_id', 0)->get();
 
Правиш полето за записване на продукта незадължително (ако е задължително).

И после:

Код:
$product->category_id = Input::has('category') ? Input::get('category') : null;

Полето ти трябва да е nullable (ама щом казваш, че default e null), значи е.
 

Back
Горе