Laravel orderby的问题

时间:2017-08-16 12:42:27

标签: php laravel laravel-5 laravel-5.2

我想在客户点击产品页面内的订单后按价格订购我的产品。我不断收到下一个错误:未定义索引:title(查看:C:\ xampp \ htdocs \ eshop \ resources \ views \ content \ item.blade.php)。 我的' item.blade.php'是在单独页面中显示产品较大尺寸的页面。我认为问题出在我的控制器项目函数或我的模型getItem函数中,我可能错了...如果你能帮助我,我将不胜感激。谢谢

我的路线:

for map in arr:
    for mID in list(arr[map]): # here's the copy of the keys
        v = arr[map][mID]['val']
        if v < 1:
            del arr[map][mID] # allowed because you are not iterating on the dict, but on the copy of the keys

我在content.products中的观点:

Route::get('shop/{category_url}/sorting-{sort?}', 'ShopController@products'); 

我的item.blade.php:

 @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>  

我的控制器:

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

1 个答案:

答案 0 :(得分:1)

因此,基于聊天,我将尝试提供答案。

首先,我们需要了解您希望如何构建数据库。

我可以肯定地看到你有产品&amp;分类。我仍然不清楚你用$ items尝试实现的目标。

所以,从这开始,你有两个表。让我们通过思考来确定他们之间的关系。首先,问一个问题,产品可以有多少类别(1个或多于1个)?大多数人构造类别,因此产品可以有多个,所以在Laravel中,这被称为HasMany关系。与此相反的是#34;一个类别可以生产多少种产品?&#34;。在这种情况下,答案再次超过1.因此,这实际上是一个BelongsToMany关系,而不是HasMany关系。一个类别可以有很多产品,一个产品可以有很多类别。

接下来,您需要创建一个数据透视表。这是一个表,用于存储产品的ID以及具有关系的类别的ID。您可以创建一些看起来像这样的迁移。他们每个人都应该进入&#34; up&#34;方法

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;

好的,现在让我们开始吧。你的路线看起来很好,但我不会按照你的方式添加排序。您可以将其作为GET数据发送,如http://example.com/shop/test-category?sort=ASC

Route::get('shop/{category_url}', 'ShopController@products');

好的,现在你的控制器了。

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

如果没有看到更多,我可以更具体,因为我不清楚你是如何处理你的$物品的。您应该按照我们设置产品和类别的方式进行设置。考虑一下这种关系,并确定它是否是&#34; HasMany&#34;,&#34; HasOne&#34;或&#34; BelongsToMany&#34;。

此外,您应该尝试并遵循默认的命名约定。您的数据库表应为小写和复数。所以表格名称应该是&#34; products&#34;和&#34;类别&#34;。你的模型应该是单一的。 &#34;产品&#34; &安培; &#34;分类&#34 ;.无需为其命名&#34;分类&#34;。然后,对于所有数据透视表,您希望将它们命名为以下&#34; category_product&#34;。因此,您正在使用两个表格进行单数和字母顺序排列。最后,在您的数据库中,您需要确保您的数据透视表列名为&#34; product_id&#34; &安培; &#34; category_id&#34;,所以数据库名称的单数版本+&#34; _id&#34;。

我希望这足以让你前进。