2017-08-16 70 views
1

我試圖通過價格訂購我的產品,一旦客戶點擊產品頁面內的訂單。我不斷收到下一個錯誤:Undefined index:title(View:C:\ xampp \ htdocs \ eshop \ resources \ views \ content \ item.blade.php)。 我的'item.blade.php'是顯示單獨頁面中產品的較大尺寸的頁面。我認爲這個問題是我的控制器項目函數內部或IM我的模型的getItem功能,我可能是錯的...將不勝感激,如果你能幫助我.ThanksLaravel訂單發行

我的路線:

Route::get('shop/{category_url}/sorting-{sort?}', '[email protected]'); 

我的看法在content.products:

@if($products) 

    <br><br> 
    <a href=" {{ url('shop/'.$category['url'].'/sorting-asc')}}" style="color:black"> High to low</a> | 
    <a href=" {{ url('shop/'.$category['url'].'/sorting-desc')}}" style="color:black">Low to high</a> 

我item.blade.php:

@extends ('master') 

@section('content') 
<div class="row"> 
    <div class="col-md-12 text-center"> 
    @if('item') 
    <h1>{{ $item['title']}}</h1> 
    <p><img width="500" src="{{ asset ('images/' . $item['image'])}}" </p> 
    <p>{!! $item['article'] !!}</p> 
    <p><b>Price on site:</b>{{ $item['price']}}$</p> 
    <p> 
     @if(Cart::get($item['id'])) 
     <input disabled="disabled" type="button" value="In Cart!" class="btn btn-success"> 
     @else 
     <input data-id="{{ $item['id']}}" type="button" value="+ Add to cart" class="btn btn-success add-to-cart"> 
     @endif 

     <a href="{{ url('shop/checkout') }}" class="btn btn-primary">Checkout</a> 
    </p> 
     @else 
     <p class="text-center" style="font-size: 18px">No product details ...</p> 
    @endif 
    </p> 
@endsection 

我的控制器:

public function products(Request $request, $category_url, $sort= 'ASC'){ 
    Product::getProducts($category_url, self:: $data); 
    $catsort = Categorie::where('url', '=', $category_url)->first(); 
    $products = Product::where('categorie_id', $catsort->id)->orderBy('price', $sort)->get(); 
    return view('content.products', self::$data ,['products' => $products, 'sort' => $sort]); 
} 

public function item($category_url, $product_url){ 

     Product::getItem($product_url, self::$data); 

     return view('content.item', self::$data); 
    } 

我的模型:

static public function getProducts($category_url, &$data){ 

    $data['products']=$data['category']=[]; 


    if ($category=Categorie::where('url','=', $category_url)->first()){ 

     $category= $category->toArray(); 
     $data['category']=$category; 
     $data['title']=$data['title']. ' | ' . $category['title']; 


     if ($products=Categorie::find($category['id'])->products){ 

      $data['products']= $products->toArray(); 
     } 
    } 
} 

static public function getItem($product_url, &$data) { 


    $data['item'] = []; 

    if ($product = Product::where('url', '=', $product_url)->first()) { 

     $product = $product->toArray(); 

     $data['item'] = $product; 
     $data['title'] .= '|' . $product['title']; 

    } 
} 
+0

**註釋不適用於擴展討論或調試會話**;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/152083/discussion-on-question-by-pioneer2017-issue-with-laravel-orderby)。如果您在評論中要求您提供澄清或代碼,您需要將其編輯到您的問題中。 –

回答

1

因此,基於聊天,我要去嘗試,並提供一個答案。

首先,我們需要了解如何構建數據庫。

我可以確定您有產品&類別。我仍然不清楚你想用$物品達到什麼目的。

所以,從這開始,你有兩個表。讓我們通過思考來確定他們之間的關係。首先,問一個問題,一個產品有多少類別(1個或多個)?大多數人構造類別,因此產品可以有多個,所以在Laravel中,這被稱爲HasMany關係。與此相反的是「一個類別可以有多少產品?」。在這種情況下,答案再次超過1.因此,而不是HasMany關係,這實際上是BelongsToMany關係。一個類別可以有很多產品,一個產品可以有很多類別。

接下來,您需要創建數據透視表。這是一個表格,它將存儲產品的ID和具有關係的類別的ID。你可能會創建一些看起來像這樣的遷移。他們中的每一個都應該在「up」方法中使用它自己的遷移文件。

Schema::create('products', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->string('slug', 100)->index(); 
    $table->integer('price'); 
    $table->timestamps(); 
}); 


Schema::create('categories', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->string('slug', 100)->index(); 
     $table->timestamps(); 
    }); 


Schema::create('category_product', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('category_id')->index(); 
     $table->integer('product_id')->index(); 
     $table->timestamps(); 
    }); 

接下來我們需要設置模型來接受關係。因此,在您的Product.php類中,添加以下方法。

public function categories(){ 
    return $this->belongsToMany(Category::class); 
} 

和這個在Category.php類倒數。現在

public function products(){ 
    return $this->belongsToMany(Product::class); 
} 

,你應該能夠訪問像這樣

$category = Category::first(); 
$products = $category->products; 

好你的人際關係,現在讓我們得到這個工作。你的路線看起來不錯,但我不會像你那樣添加排序。你可以像這樣http://example.com/shop/test-category?sort=ASC

Route::get('shop/{category_url}', '[email protected]'); 

好吧發送此作爲獲取數據,所以現在你的控制器。

public function products(Request $request, $category_url){ 
    $category = Category::with(['products' => function($q){ 
     $q->orderBy('price', request()->get('sort')??"ASC"); 
    }])->whereSlug($category_url)->first(); // Eager load in products 

    return view('content.products', ['category' => $category]); 
} 

最後,在刀片中,您現在可以使用對象語法而不是數組語法。

@section('content') 
    Category Name: {{$category->name}} <br /> 
    @foreach($category->products as $product) 
     Product Name: {{$product->name}} <br /> 
     Product Price: {{$product->price}} <br /> 
     Product Name: {{$product->name}} <br /> 
    @endforeach 
@endsection 

沒有看到更多,我不能更具體,因爲我不清楚你如何處理你的$物品。您應該按照我們設置產品和類別的方式進行設置。考慮關係並確定它是「HasMany」,「HasOne」還是「BelongsToMany」。

此外,還有一些默認的命名約定,您應該嘗試遵循。您的數據庫表格應該是小寫字母和複數形式。所以表名應該完全是「產品」和「類別」。你的模型應該是單一的。 「產品」&「類別」。無需將其命名爲「Categorie」。然後,對於所有數據透視表,您希望將它們命名爲以下「category_product」。所以,您在擺動的兩張桌子上的單數和字母順序。最後,在您的數據庫中,您需要確保數據透視表列的名稱爲「product_id」&「category_id」,因此數據庫名稱的單數版本+「_id」。

我希望這足以讓你走。

+0

我更新了我的問題和代碼,提供了有關「項目」目的的更多信息並添加了一些代碼。請看一看。 – Pioneer2017

+0

你是什麼意思,該產品是更大的產品? – MMMTroy

+0

在您的getItems方法中,將「$ data ['title']。=」更改爲「$ data ['title'] =」。 – MMMTroy