Laravel Eloquent-сохранение, обновление и удаление запроса в связанных таблицах
Я пытаюсь разработать какой-то API с Laravel 5.4 и пытаюсь сохранить,обновить и удалить sales с его соответствующими деталями продаж, но все еще не делаю никакого главного пути после того, как попробовал и прошел через множество примеров кода, найденных здесь. Я хочу иметь возможность:
- сохранить продажи и их детали продаж (без сопоставления полей по одному)
- обновление продажи и сведений о ней (без сопоставления полей по одному)
- удалить продажу и ее детали все однажды.
Ниже приведены мои коды
Отношения Модели Продажи
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 ответа:
Попробуйте сохранить модели 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'; }