При попытке добавить товар в корзину у меня возникает такая ошибка: «Свойство [id] не существует в экземпляре Eloquent builder».

#laravel #e-commerce #cart

#laravel #электронная коммерция #Корзина

Вопрос:

У меня проблема с корзиной электронной коммерции. В моем контроллере, когда я использую свойство first() в своем запросе, товар, добавляемый в мою корзину, всегда один и тот же, первый, который я нажимаю.

Это мой код:

Контроллер:

 public function addToCart(Request $request)
{
    $reference = $request->reference;
    $ean = $request->ean;


    $product = Product::where('ean', $reference)->first();

    if(!$product) {

        abort(404);

    }

    $cart = session()->get('cart');

    // if cart is empty then this the first product
    if(!$cart) {

        $cart['product'] = [
            'id' => $product->id,
            "ean" => $product->ean,
            "quantity" => 1,
            "price" => $product->product_price,
            "reference" => $product->reference
    ];

        session()->put('cart', $cart);

        return redirect()->back()->with('success', 'Product added to cart successfully!');
    }

    // if cart not empty then check if this product exist then increment quantity
    if(isset($cart['product'])) {

        $cart['product']['quantity']  ;

        session()->put('cart', $cart);

        return redirect()->back()->with('success', 'Book added!');

    }

    // if item not exist in cart then add to cart with quantity = 1
    $cart['product'] = [
        'id' => $product->id,
        "ean" => $product->ean,
        "quantity" => 1,
        "price" => $product->product_price,
        "reference" => $product->reference                 
    ];

    session()->put('cart', $cart);

    return redirect()->back()->with('success', 'Book added!');
}
 

вид магазина :

 <div class="container products">
    <div class="row">
      <table class="table">
        <thead>
          <tr>
            <th>ID</th>
            <th>Ean</th>
            <th>Prezzo</th>
            <th>Actions</th>
          </tr>
        </thead>
        <tbody>
          @foreach ($products as $product)
            <tr>             
              <td>{{$product->id}}</td>
              <td>{{$product->ean}}</td>
              <td>{{$product->product_price}} €</td>
            <td>
              <p class="btn-holder"><a href="{{ url('add-to-cart/'. $product['reference']) }}" class="btn btn-warning btn-block text-center" role="button">Add to cart</a> </p>                  
            </td>                               
            </tr>
            @endforeach
        </tbody>
      </table>
    </div>
</div>
 

В dd($product) У меня есть это:

введите описание изображения здесь

Я не знаю, является ли проблема свойством first() или она находится в другой части кода; Как я могу решить эту проблему?

Комментарии:

1. Привет. Вы пытались отладить и посмотреть, что находится в вашей $product переменной? Например, с dd($product); помощью .

2. у вас есть данные в таблице товаров? если вы не уверены, пожалуйста, запишите dd($product) и покажите результат, кажется, что он пустой, поэтому он показывает ошибку.

3. Да, я пытаюсь, и у меня есть все товары в моем представлении с деталями продуктов и в dd ($product) У меня есть подробности.

Ответ №1:

создайте свой контроллер и просмотрите резервную копию. проверьте этот код. Контроллер первого считывания

       public function addToCart(Request $request)
    {
        $reference = $request->reference;
        $ean = $request->ean;//you don't get it. It's waste variable
    
        $product = Product::where('ean', $reference)->first();
    
        if(!$product) {
    
            abort(404);
    
        }
    
        $cart = session()->get('cart');
    
        // if cart is empty then this the first product
        if(!$cart) {
    
            $cart['product'] = [
                'id' => $product->id,
                "ean" => $product->ean,
                "quantity" => 1,
                "price" => $product->product_price,
                "reference" => $product->reference
        ];
    
            session()->put('cart', $cart);
    
            return redirect()->back()->with('success', 'Product added to cart successfully!');
        }
    
        // if cart not empty then check if this product exist then increment quantity

        if(isset($cart['product'])) {
    
            $cart['product']['quantity']  ;
    
            session()->put('cart', $cart);
    
            return redirect()->back()->with('success', 'Book added!');
    
        }
        else{
//this below code run with your both if statements. if any one statement true then both if statement and this below code run one same time so check this below code your controller and think
        // if item not exist in cart then add to cart with quantity = 1
        $cart['product'] = [
            'id' => $product->id,
             "ean" => $product->ean,
            "quantity" => 1,
            "price" => $product->product_price,
            "reference" => $product->reference                 
        ];
    
        session()->put('cart', $cart);
    
        return redirect()->back()->with('success', 'Book added!');
      }
    }
 

Комментарии:

1. Если я заменю свойство first() из запроса на get() Я вижу это сообщение об ошибке: «Свойство [id] не существует в экземпляре Eloquent builder».

2. Я сделал, но с последним изменением теперь у меня есть страница с ошибкой 404. Но проблема не может быть в методе, который я использую для доступа к коллекции?

3. $product = Product::where(‘reference’, $reference)->first();

4. Да, но логика корзины работает, потому что, когда я нажимаю «Добавить в корзину», я нахожу товар внутри корзины. Но когда я нажимаю на второй, другой товар, я нашел в своей корзине первый товар x 2.