Laravel Eloquent - 将请求保存,更新和删除到相关表中

时间:2017-06-15 13:46:28

标签: php mysql eloquent laravel-5.4

我正在尝试使用Laravel 5.4开发某种类型的API,并一直尝试使用其相关的销售详细信息来保存,更新和删除销售,但在尝试并查找了大量代码示例后仍然没有任何进展这里。 我希望能够:

  1. 保存销售及其销售详情(无需逐个映射字段)
  2. 更新销售及其销售详情(不逐一映射字段)
  3. 一次删除销售及其详细信息。
  4. 下面是我的代码

    销售模式关系

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use App\Models\SalesDetail;
    
    class Sale extends Model
    {
    //
      protected $fillable=[
        'receipt',
        'customer',
        'total_cost',
        'amount_paid',
        'payment_type',
        'discount_percent',
        'discount_amount'
    
      ];
    
      // a sale has many sales details
      public function saleDetails(){
        return $this->hasMany('App\Models\SalesDetail');
      }
    }
    

    销售明细模型关系

     namespace App\Models;
    
     use Illuminate\Database\Eloquent\Model;
     use App\Models\Sale;
    
     class SalesDetail extends Model
     {
      //
      protected $fillable=[
        // 'sales_id',
        'category',
        'menu',
        'unit',
        'quantity',
        'cost'
    
       ];
    
       // A sales detail  belongs to a sale
       public function sale(){
        return $this->belongsTo('App\Models\Sale');
       }
     }
    

    销售控制器 - 保存功能(更新 - 现在正常工作)

    public function store(Request $request)
      {
        //Validate request data
         $this->validate($request,['receipt'=>'required']);
    
         //Save sales without sales details data
        $sale = Sale::create($request->except(['sale_details']));
    
        //Get sales details data
        $saledetails = $request->sale_details;
    
        //Loop through sales details
        foreach ($saledetails as $data){
    
            //Create a new instance of sales details model
            $details = new SalesDetail;
    
            //fill the model properties (mass assignment) with the data
            $details->fill($data);
    
            //Save and link sales details to sales 
            $sale->saleDetails()->save($details);
    
        }
    
        return 'Sale saved successfully';
    }           
    

    销售控制器 - 更新功能

     public function update(Request $request, $id)
    {
        //
          $this->validate($request,['receipt'=>'required']);
    
        $sale = Sale::with('saleDetails')->findOrFail($id);
    
        $input=$request->all();
        $sale->fill($input)->save();
    
        return 'Sale updated successfully';
    }
    

    销售控制器 - 删除功能

    public function destroy($id)
    {
        //
        Sale::with('saleDetails')->whereId($id)->first()->delete();
    
        return 'Sale deleted sucessfully';
    }
    

    示例销售数据

    {
    "id": 1,
    "receipt": "RT124558",
    "customer": "John Dumelo",
    "total_cost": 1000,
    "amount_paid": 900,
    "payment_type": "Cash",
    "discount_percent": 0.1,
    "discount_amount": 100,
    "created_at": "2017-06-12 00:00:00",
    "updated_at": "2017-06-12 00:00:00",
    "sale_details": [
        {
            "id": 1,
            "sale_id": 1,
            "category": "Pizza",
            "menu": "Meat Eater",
            "unit": "Large",
            "quantity": 10,
            "cost": 50,
            "created_at": "2017-06-14 00:00:00",
            "updated_at": "2017-06-14 00:00:00"
        },
        {
            "id": 2,
            "sale_id": 1,
            "category": "Pizza",
            "menu": "Meat Deluze",
            "unit": "Medium",
            "quantity": 5,
            "cost": 30,
            "created_at": "2017-06-14 00:00:00",
            "updated_at": "2017-06-14 00:00:00"
        }
      ]
    }
    

    我是Laravel的新手,希望我能得到帮助。 先感谢您。

2 个答案:

答案 0 :(得分:1)

尝试单独保存Sale和SaleDetail模型,然后按以下方式关联它们:

$sale->saleDetails()->associate($details); 

根据您的SaleDetails模型,您需要对此进行过滤:

"sale_details": [
    {
        "id": 1,
        "sale_id": 1,
        "category": "Pizza",
        "menu": "Meat Eater",
        "unit": "Large",
        "quantity": 10,
        "cost": 50,
        "created_at": "2017-06-14 00:00:00",
        "updated_at": "2017-06-14 00:00:00"
    },
    {
        "id": 2,
        "sale_id": 1,
        "category": "Pizza",
        "menu": "Meat Deluze",
        "unit": "Medium",
        "quantity": 5,
        "cost": 30,
        "created_at": "2017-06-14 00:00:00",
        "updated_at": "2017-06-14 00:00:00"
    }
  ]

仅限于此:

"sale_details": [
    {
        "category": "Pizza",
        "menu": "Meat Eater",
        "unit": "Large",
        "quantity": 10,
        "cost": 50
    },
    {
        "category": "Pizza",
        "menu": "Meat Deluze",
        "unit": "Medium",
        "quantity": 5,
        "cost": 30
    }
  ]

答案 1 :(得分:1)

销售控制器 - 保存功能(更新 - 现在正常工作)

public function store(Request $request)
  {
    //Validate request data
     $this->validate($request,['receipt'=>'required']);

     //Save sales without sales details data
    $sale = Sale::create($request->except(['sale_details']));

    //Get sales details data
    $saledetails = $request->sale_details;

    //Loop through sales details
    foreach ($saledetails as $data){

        //Create a new instance of sales details model
        $details = new SalesDetail;

        //fill the model properties (mass assignment) with the data
        $details->fill($data);

        //Save and link sales details to sales 
        $sale->saleDetails()->save($details);

    }

    return 'Sale saved successfully';
}           

销售控制器 - 更新功能(更新 - 现在正常工作)

 public function update(Request $request, $id)
{
    //
      $this->validate($request,['receipt'=>'required']);

    $sale=Sale::findOrFail($id);
   $saleinput = $request->except(['sale_details']);

    $sale->fill($saleinput)->save();

    $saledetails = $request->sale_details;

    //Delete previous sales details
    SalesDetail::where('sale_id', $id)->delete();

    foreach ($saledetails as $data){
        $details = new SalesDetail;
        $details->fill($data);
        $sale->saleDetails()->save($details);

    }

    return 'Sale updated successfully';
}

销售控制器 - 删除功能(已更新 - 现在正常工作)

public function destroy($id)
{
    //Delete sales details before deleting sales
    SalesDetail::where('sale_id', $id)->delete();
    Sale::whereId($id)->first()->delete();


    return 'Sale deleted sucessfully';
}
相关问题