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