【问题标题】:Got an error in laravel as:ErrorException Undefined variable: productslaravel 报错:ErrorException Undefined variable: products
【发布时间】:2020-08-11 10:43:22
【问题描述】:

我是 Laravel 的新手,这是我的第一个项目。我正在开发一个电子商务网站。到目前为止,我已经在 StackOverflow 和 laracasts 的帮助下完成了这个项目。为什么我会收到此错误?

我得到一个错误, ErrorException 未定义变量:产品

这是我的控制器。

CartController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Product;
use App\Category;


class CartController extends Controller
{
    
    public function index()
{
     $products = Product::get();
     return view ('cart')->with(compact('products'));
     
 }

   
    public function create()
    {
        //
    }

   
    public function store(Request $request)
    {
        //
    }

   
    public function show($id)
    {
        $products = Product::find($id);
       
        return view('cart')->with(compact('product'));
   }
   
   
    public function edit($id)
    {
        //
    }

    
    public function update(Request $request, $id)
    {
        //
    }

   
    public function destroy($id)
    {
        //
    }
}

这是我的刀片文件。

cart.blade.php

@extends('layouts.single')
@section('content')

 @foreach($products as $p) 
                            <tr class="">
                                <td class="text-center">
                                    <a href="#" class="text-gray-32 font-size-26">×</a>
                                </td>
                              
                                <td class="d-none d-md-table-cell">
                                    <a href="#"><img class="img-fluid max-width-100 p-1 border border-color-1"  alt="Image Description"></a>
                                </td>
                                
                                <td data-title="Product">
                                    <a href="#" class="text-gray-90">{{ $p ['prod_name'] }}</a>
                                </td>
                               
                                <td data-title="Price">
                                    <span class="">LKR {{ $p ['prod_price'] }}.00</span>
                                </td>
                               
                                <td data-title="Quantity">
                                    <span class="sr-only">Quantity</span>
                                    <!-- Quantity -->
                                    <div class="border rounded-pill py-1 width-122 w-xl-80 px-3 border-color-1">
                                        <div class="js-quantity row align-items-center">
                                            <div class="col">
                                                <input class="js-result form-control h-auto border-0 rounded p-0 shadow-none" type="text" value="1">
                                            </div>
                                            <div class="col-auto pr-1">
                                                <a class="js-minus btn btn-icon btn-xs btn-outline-secondary rounded-circle border-0" href="javascript:;">
                                                    <small class="fas fa-minus btn-icon__inner"></small>
                                                </a>
                                                <a class="js-plus btn btn-icon btn-xs btn-outline-secondary rounded-circle border-0" href="javascript:;">
                                                    <small class="fas fa-plus btn-icon__inner"></small>
                                                </a>
                                            </div>
                                        </div>
                                    </div>
                                    <!-- End Quantity -->
                                </td>

                                <td data-title="Total">
                                    <span class="">$1,100.00</span>
                                </td>
                            </tr>
                            @endforeach
@endsection    

这是我的路线。

web.php

Route::get('/cart', 'CartController@index')->name('cart');
Route::get('/cart/{id}', 'CartController@show')->name('cart');

产品表

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('prod_name');
            $table->string('prod_brand')->nullable();
            $table->unsignedBigInteger('cat_id');
            $table->string('prod_description')->nullable();
            $table->string('prod_item_code')->nullable();
            $table->string('prod_modal')->nullable();
            $table->string('prod_size')->nullable();
            $table->string('prod_weight')->nullable();
            $table->string('prod_height')->nullable();
            $table->string('prod_manufacturer')->nullable();
            $table->float('prod_price')->nullable();
            $table->float('prod_discount')->nullable();
            $table->float('prod_quantity')->nullable();
            $table->string('prod_image_path')->nullable();
            $table->timestamps();

            $table->foreign('cat_id')
            ->references('id')
            ->on('categories')
            ->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

产品型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Storage;

class Product extends Model
{
 
    
}

【问题讨论】:

  • index() 控制器的方法已将$products 分配给数组但从未定义,我想您需要从模型中获取您的产品,然后将记录分配给$products
  • 意思是,我需要添加一个foreach函数吗?
  • 这意味着你需要像$products = Product::limit(10)-&gt;get(); 这样的东西才能将它分配给数组

标签: php laravel model-view-controller woocommerce e-commerce


【解决方案1】:

您的问题出在控制器的 index 方法中。在第一行,您尝试分配 $products,但该变量不存在。

public function index()
{
    $arr['products'] = $products;
    return view('cart')->with($arr);

}

您需要获得所有产品才能执行此操作。比如:

public function index(Request $request)
{
    $arr['products'] = Product::all();
    return view('cart')->with($arr);

}

此示例将只为您提供数据库中的所有产品。这并不是一个真正好的解决方案,因为您可以拥有很多产品,从而使响应巨大且昂贵。为了解决这个问题,您可以添加分页。下面是一个简单的实现示例:

您需要获得所有产品才能执行此操作。比如:

public function index(Request $request)
{
    $limit = $request->input('limit', 10);
    $page = $request->input('page', 1);

    $arr['products'] = Product::paginate($limit, [], 'page', $page)->items();
    return view('cart')->with($arr);
}

同样,这只是一个让您了解此概念的示例,可能更多的是用于 API 响应而不是查看响应,就像您在此处所做的那样,但尽管如此,您最终还是需要了解一些事情。在此处阅读更多信息:https://laravel.com/docs/7.x/pagination

编辑:由于您尝试在视图中显示多个产品,因此您还必须迭代产品,以便您可以逐个渲染它们。为此,您需要阅读:https://laravel.com/docs/7.x/blade#loops

【讨论】:

  • 其实我的要求是,我需要添加一个产品到购物车。为此我需要分页吗?
  • 不,如果您想显示多个产品或其他模型的列表,您只需要分页。我刚刚提到它是因为您的索引方法中存在问题,您最终可能需要分页。顺便提一下,你肯定很快就会遇到这个要求。
  • 好的,谢谢。我编辑了索引功能,请看一下。在我这样更改后出现错误,因为此集合实例上不存在属性 [prod_name]。 (查看:C:\xampp\htdocs\bizzcomputer\resources\views\cart.blade.php)
  • 您能否也将 Product 模型类添加到原始问题中?这可能是因为 prod_name 在产品上不存在,但您试图从视图中调用它:&lt;a href="#" class="text-gray-90"&gt;{{ $products-&gt;['prod_name'] }}&lt;/a&gt;
  • 我也更新了我的答案。请阅读编辑。这与您对多个项目的视图和渲染有关。
猜你喜欢
  • 2021-02-03
  • 2017-02-17
  • 2014-09-09
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2019-11-23
  • 2018-02-22
相关资源
最近更新 更多