PHP/Laravel - Darryldecode/shoppingcart afhandeling

Pagina: 1
Acties:

Vraag


  • THERTH
  • Registratie: Februari 2021
  • Laatst online: 03-09-2021
Beste Tweakers,

Ik loop tegen een probleem aan en weet echt niet meer waar ik het moet zoeken inmiddels, laat staan oplossen.. :'(

Ik maak gebruik van Darryldecode/shoppingCart voor het afhandelen van mijn winkelmand. Zoals in de handleiding gesteld wordt moet er gebruik gemaakt worden van een uniek ID om elk uniek product te identificeren. Door gebruik te maken van de functie 'associatedModel' verwijs ik naar het modal 'Product'.

Dit is hoe mijn controller eruit ziet voor het afhandelen van het toevoegen van producten aan de winkelmand.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public function store(Request $request)
    {
        $product = Product::find($request->id);
        $options = $request->get('options');

        $id = md5($product->id.serialize($options));

        if($options) {
            $total = ($product->price) + array_sum(($options));
        } else {
            $total = ($product->price);
        }

        Cart::add(array(
            'id' => $id,
            'name' => $product->title,
            'price' => $total,
            'quantity' => 1,
            'attributes' => $options,
            'associatedModel' => $product
        ));

        return redirect()->back();
    }


Als ik gebruik van $product->id i.p.v $id bij Cart::add(array( 'id' => ) in de CartController werkt het wel naar behoren, alleen overschrijft hij dan de producten met dezelfde maat in de winkelmand.

Het probleem ontstaat (denk ik) zodra er bij het afrekenen alles opgeslagen moet worden in de database.

code:
1
2
3
4
5
6
7
8
9
$cartItems = \Cart::getContent();

            foreach ($cartItems as $item) {
                $order->items()->attach($item->id, [
                    'price' => $item->price,
                    'quantity' => $item->quantity,
                    'attributes' => $item->attributes
                ]);
            }


In de OrderController maak ik gebruik van de bovenstaande code voor het afhandelen van mijn winkelmand. Bij het opslaan van de data naar de database gaat het verkeerd. Ik krijg dan de volgende foutmelding:

code:
1
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`db_naam`.`order_items`, CONSTRAINT `order_items_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE) (SQL: insert into `order_items` (`attributes`, `order_id`, `price`, `product_id`, `quantity`) values (["wit","xl"], 288, 10.8, 9ec7f8fe16b552ef04d2394361d79022, 1))


Nu snap ik heel goed waar de foutmelding vandaan komt. Aangezien er in mijn database geen product bestaat met het id: '9ec7f8fe16b552ef04d2394361d79022'. Dus dat de melding volkomen normaal is.

Dit is mijn database migratie:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function up()
    {
        Schema::create('order_items', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->unsignedBigInteger('order_id')->index();
            $table->unsignedBigInteger('product_id')->index();

            $table->float('price');
            $table->string('attributes')->nullable();
            $table->integer('quantity');

            $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');

            $table->timestamps();
        });
    }


Hier ligt mijn vraagstuk, ik kom er namelijk totaal niet uit hoe ik het productID kan laten verwijzen i.p.v. het unieke rowID. Aangezien het in de request wel meegestuurd wordt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "9ec7f8fe16b552ef04d2394361d79022": {
    "id": "9ec7f8fe16b552ef04d2394361d79022",
    "name": "T-shirt",
    "price": 10.8,
    "quantity": 1,
    "attributes": [
      "wit",
      "xl"
    ],
    "conditions": [],
    "associatedModel": {
      "id": 2,
      "title": "T-shirt",
      "image": null,
      "sku": "202001",
      "price": "10.80",
      "created_at": "2021-06-14T19:12:52.000000Z",
      "updated_at": "2021-09-01T16:21:23.000000Z"
    }
  }
}


Als de foreign product_id naar de products tabel uit mijn migratie haal, werkt het. Alleen wordt het bestelde product niet opgeslagen bij de order.

Mijn vraag voor jullie is of mijn migratie van geen kanten klopt of sla ik een aantal stappen over bij het afhandelen van mijn winkelmand, want daar is helaas in de handleiding niks over te vinden.

Alle reacties


  • THERTH
  • Registratie: Februari 2021
  • Laatst online: 03-09-2021
Oplossing gevonden...

In de OrderController verwezen naar $item->associatedModel->id i.p.v. $item->id of $item->product->id.

Hoe kan ik dit topic sluiten?

Acties:
  • 0 Henk 'm!

  • AlphaRomeo
  • Registratie: Maart 2007
  • Laatst online: 22:33

AlphaRomeo

FP PowerMod
Het topic hoeft niet gesloten te worden. Fijn dat je de oplossing gevonden en gedeeld hebt.