Проблема с заказом Laravel

Я пытаюсь упорядочить свои товары по цене, как только клиент нажмет на странице товара. Я продолжаю получать следующую ошибку: неопределенный индекс: заголовок (представление: C: \ xampp \ htdocs \ eshop \ resources \ views \ content \ item.blade.php).
Мой ‘item.blade.php’ — это страница, которая показывает больший размер продукта на отдельной странице. Я думаю, что проблема в моей функции Item контроллера или в моей функции getItem моей модели, я могу ошибаться … был бы признателен, если бы вы могли помочь мне. Спасибо

Мой маршрут:

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

Мой взгляд на 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'];

}
}

1

Решение

На основании чата я постараюсь дать ответ.

Для начала нам нужно понять, как вы хотите структурировать свою базу данных.

Я точно вижу, что у вас есть Продукты & Категории. Я до сих пор не понимаю, чего вы пытаетесь достичь с помощью $ items.

Итак, начиная с этого, у вас есть две таблицы. Подумайте об этом, чтобы определить, какие у них отношения. Для начала задайте вопрос, сколько категорий может иметь товар (1 или более 1)? Большинство людей структурируют категории, поэтому у продуктов может быть более одной категории, поэтому в Laravel это называется отношением HasMany. Обратное значение этого слова — «сколько продуктов может иметь категория?». Ответ, опять же, в этом случае, больше 1. Поэтому вместо отношения HasMany на самом деле это отношение BelongsToMany. У категории может быть много продуктов, а у продукта может быть много категорий.

Далее вам нужно создать сводную таблицу. Это таблица, в которой будут храниться идентификатор продукта и идентификатор категории, которая имеет отношение. Вы можете создать некоторые миграции, которые выглядят следующим образом. Каждый из них должен идти в своем собственном файле миграции в методе «вверх».

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}', '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

Не видя больше, я не могу быть более конкретным, так как мне не ясно, как вы пытаетесь обработать ваши $ элементы. Вы должны настроить его так же, как мы настраиваем продукты и категории. Подумайте об отношениях и определите, является ли это «HasMany», «HasOne» или «BelongsToMany».

Кроме того, существуют соглашения о присвоении имен по умолчанию, которым вы должны следовать. Ваши таблицы базы данных должны быть строчными и множественными. Таким образом, имена таблиц должны быть точно «продукты» и «категории». Ваши модели должны быть единичными. «Товар» & «Категория». Не нужно называть это «Категория». Затем для всех сводных таблиц вы хотите назвать их как следующий «category_product». Так что в единственном и алфавитном порядке с двумя таблицами, на которых вы вращаетесь. Наконец, в вашей базе данных вы должны убедиться, что столбцы сводной таблицы названы «product_id» & «category_id», поэтому единственная версия имени базы данных + «_id».

Надеюсь, этого достаточно, чтобы вы пошли.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector