Laravel Eloquent-сохранение, обновление и удаление запроса в связанных таблицах


Я пытаюсь разработать какой-то API с Laravel 5.4 и пытаюсь сохранить,обновить и удалить sales с его соответствующими деталями продаж, но все еще не делаю никакого главного пути после того, как попробовал и прошел через множество примеров кода, найденных здесь. Я хочу иметь возможность:

  1. сохранить продажи и их детали продаж (без сопоставления полей по одному)
  2. обновление продажи и сведений о ней (без сопоставления полей по одному)
  3. удалить продажу и ее детали все однажды.

Ниже приведены мои коды

Отношения Модели Продажи

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use AppModelsSalesDetail;

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('AppModelsSalesDetail');
  }
}

Детализация Продаж Модель Отношений

 namespace AppModels;

 use IlluminateDatabaseEloquentModel;
 use AppModelsSale;

 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('AppModelsSale');
   }
 }

Контроллер продаж - функция сохранения (Обновлено-теперь работает нормально)

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"
    }
  ]
}

Я новичок в Ларавеле и хотел бы получить помощь на этот. Заранее спасибо.

2 2

2 ответа:

Попробуйте сохранить модели 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
    }
  ]

Контроллер продаж - функция сохранения (Обновлено-теперь работает нормально)

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';
}