2017-08-16 4 views
1

Ich versuche, meine Produkte nach Preis zu bestellen, sobald der Kunde klicken Sie auf Bestellung auf der Produktseite. Ich bekomme immer den nächsten Fehler: Undefinierter Index: Titel (Ansicht: C: \ xampp \ htdocs \ eshop \ ressourcen \ ansichten \ content \ item.blade.php). Meine 'item.blade.php' ist die Seite, die die größere Größe des Produkts in einer separaten Seite zeigt. Ich denke, das Problem in meiner Controller Artikel Funktion ist oder mein Modell getItem Funktion im, ich könnte falsch sein ... wäre dankbar, wenn Sie mir helfen können .Thanks ausProblem mit Laravel orderby

Meine Route:

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

Meine Ansicht in 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> 

Mein 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 

Mein Controller:

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); 
    } 

My Model:

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

** Kommentare sind nicht für erweiterte Diskussion oder Debugging-Sitzungen **; Diese Konversation wurde [verschoben, um zu chatten] (http://chat.stackoverflow.com/rooms/152083/discussion-on-question-by-pioneer2017-issue-with-laravel-orderby). Wenn Sie in einem Kommentar um Klarstellung oder Code gebeten werden, müssen Sie ihn in Ihre Frage [bearbeiten]. –

Antwort

1

So basiert auf dem Chat, ich werde versuchen, und eine Antwort zu geben.

Um zu beginnen, müssen wir verstehen, wie Sie Ihre Datenbank strukturieren möchten.

Ich kann sicher sehen, Sie haben Produkte & Kategorien. Mir ist immer noch nicht klar, was du mit den $ Items erreichen willst.

Also, beginnend damit, haben Sie zwei Tabellen. Lassen Sie uns das durchdenken, um festzustellen, welche Beziehung sie haben. Stellen Sie zunächst die Frage, wie viele Kategorien ein Produkt haben kann (1 oder mehr als 1)? Die meisten Leute strukturieren Kategorien, so dass Produkte mehr als eins haben können. In Laravel wird dies als HasMany-Beziehung bezeichnet. Das Gegenteil davon ist "wie viele Produkte kann eine Kategorie haben?". Die Antwort ist, wiederum in diesem Fall, mehr als 1. Daher ist dies statt einer HasMany-Beziehung eine BelongsToMany-Beziehung. Eine Kategorie kann viele Produkte haben und ein Produkt kann viele Kategorien haben.

Als Nächstes müssen Sie eine Pivot-Tabelle erstellen. Dies ist eine Tabelle, in der die ID des Produkts und die ID der Kategorie mit einer Beziehung gespeichert werden. Sie könnten einige Migrationen erstellen, die wie folgt aussehen. Jeder von ihnen sollte in seiner eigenen Migrationsdatei in der "up" -Methode gehen.

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(); 
    }); 

Als nächstes müssen wir die Modelle einrichten, um die Beziehung zu akzeptieren. Fügen Sie in Ihrer Product.php-Klasse die folgende Methode hinzu.

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

Und das Gegenteil davon in der Category.php-Klasse.

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

Nun sollten Sie in der Lage sein, Ihre Beziehungen wie so

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

Okay, zugreifen zu können, kann nun diese Arbeit bekommen. Deine Route sieht gut aus, obwohl ich die Art nicht so hinzufügen würde, wie du bist.Sie können http://example.com/shop/test-category?sort=ASC

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

Okay, so jetzt Ihren Controller wie so diese in als GET-Daten senden.

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]); 
} 

Schließlich können Sie innerhalb Ihres Blade jetzt die Objektsyntax anstelle der Array-Syntax verwenden.

@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 

Ohne mehr zu sehen, kann ich nicht präziser sein, wie ich auf nicht klar bin, wie Sie versuchen, Ihre $ Artikel zu handhaben. Sie sollten es so einrichten, wie wir Produkte und Kategorien einrichten. Denken Sie über die Beziehung nach und stellen Sie fest, ob es sich um "HasMany", "HasOne" oder "BelongsToMany" handelt.

Außerdem gibt es Standardbenennungskonventionen, die Sie versuchen sollten zu befolgen. Ihre Datenbanktabellen sollten klein und plural sein. Daher sollten die Tabellennamen genau "Produkte" und "Kategorien" sein. Ihre Modelle sollten einzigartig sein. "Produkt" & "Kategorie". Keine Notwendigkeit, es "Kategorie" zu nennen. Dann möchten Sie sie für alle Pivot-Tabellen wie das folgende "category_product" benennen. So einzigartig und alphabetisch geordnet mit den zwei Tischen, auf die Sie schwenken. Schließlich sollten Sie in Ihrer Datenbank sicherstellen, dass Ihre Pivot-Tabellenspalten den Namen "product_id" & "category_id" haben, also die singuläre Version des Datenbanknamens + "_id".

Ich hoffe, dass es genug ist, um Sie in Gang zu bringen.

+0

Ich habe meine Frage und meinen Code aktualisiert, um mehr Informationen über den "Gegenstand" zu geben und etwas Code hinzuzufügen. Bitte guck dir das an. – Pioneer2017

+0

Was meinen Sie mit, der Artikel ist die größere Größe des Produkts? – MMMTroy

+0

Ändern Sie in Ihrer Methode "getItems" "$ data ['title']. =" To "$ data ['title'] =". – MMMTroy