-1

I have three tables, Order, OrderItem and GoldSilver. OrderItem has an order_id from Order table and OrderItem has gold_silver_id. So, Upon deleting Order I want to delete related OrderItem and GoldSilver. I can delete OrderItem through Laravel Eloquent relationship, but how can I delete GoldSilver too.
Here is my model: Order.php

public function orderItem()
{
    return $this->hasMany(OrderItem::class);
}

OrderItem.php

public function order()
{
    return $this->belongsTo(Order::class);
}

public function goldSilver()
{
    return $this->belongsTo(GoldSilver::class);
}

GoldSilver.php

public function orderItem()
{
    return $this->hasOne(OrderItem::class);
}

In my controller for delete I am doing:

public function destroy($id)
{
   
    $order =  Order::find($id);
    $order->orderItem;
 
    $dltorder = $order->orderItem()->delete();

    if($dltorder){
        return response()->json([
            'status'=>'Success',
            'message'=>'Order deleted'
        ],200);
    }
}

How can I do so? Helpis appreciated. Thank you.

Nistha Adhikari
  • 147
  • 1
  • 15
  • 1
    create a new migration and define foreign key constraints in it and you won't need to do extra code for deleting items from other tables. – Naveed Ali Aug 25 '20 at 12:10
  • I do not want to use cascade on delete @NaveedAli – Nistha Adhikari Aug 25 '20 at 12:11
  • you have to loop through the orderItem relation – Naveed Ali Aug 25 '20 at 12:14
  • easy way: you have $order , then $order_item = $order->orderItem; then loof on order ites and delete$order_item->goldSilver()->delete(); then delete orderItem $order->orderItem()->delete; – Abdel-aziz hassan Aug 25 '20 at 12:14
  • you need to add static function boot as here [check this ](https://stackoverflow.com/questions/14174070/automatically-deleting-related-rows-in-laravel-eloquent-orm) – mohamed ammar Aug 25 '20 at 12:17
  • I would recommend using cascades, Its the most logical solution. However, you can try: ```$order->orderItem->goldSilver()->delete()``` or ```$orderItem = OrderItem::findOrFail($order->orderItem->id); $orderItem->goldSilver()->delete();``` – Ali Aug 25 '20 at 13:39

2 Answers2

2

you can do something like below in destroy method:

public function destroy($id)
{
   //you have $order id, find the order and then the relation with orderItems
    $order =  Order::find($id);
    foreach($order->orderItem as $orderItem){
       $orderItem->goldSilver()->delete();
    }
 
    $dltorder = $order->orderItem()->delete();

    if($dltorder){
        return response()->json([
            'status'=>'Success',
            'message'=>'Order deleted'
        ],200);
    }
}
Naveed Ali
  • 1,043
  • 7
  • 15
0

If you want to have the goldSiver relation be deleted anytime an order item is deleted you can set up an observer for the order item and perform it in the deleting method. This prevents you from having to perform the extra deletion in your controller and ensures the goldSilver relationship will always be deleted when an order item is deleted without having to repeat yourself.

public function deleting(OrderItem $orderItem){
    $orderItem->goldSilver()->delete();
 }