سلام دوستان
اگر یک کنترلر داشته باشیم که در متد store بخواهیم همزمان توی چند تا جدول دیتا ذخیره کنیم که به هم مربوط میشن چطور میشه کدها رو ریفکتور کرد.. کد من به صورت زیره: حالا تا حد امکان کدهاش رو ریفکتور کردم.
public function store(AddProductRequest $request)
{
$shopperId = 1;
$product = new Product([
'title' => $request->title,
'slug' => to_slug_fa($request->title, Product::class),
'detail' => $request->detail,
'color_id' => $request->colorId,
'category_id' => $request->categoryId,
'img' => $request->img,
'description' => $request->description,
]);
$category = Category::find($request->categoryId);
$category->Product()->save($product);
$code = create_code($request->categoryId, $product['id'], $request->colorId);
$product->update([
'code' => $code,
]);
$price = new Price([
'price' => $request->price,
'product_id' => $product->id,
]);
$product->price()->save($price);
$stocks = [];
foreach ($request->sizeIds as $value) {
if ($request->quantity[$value] != null) {
$stocks[] = new Stock([
'stock' => $request->quantity[$value],
'product_id' => $product->id,
'size_id' => $value,
'shopper_id' => $shopperId,
]);
}
}
$product->stock()->saveMany($stocks);
$productAttributes = [];
foreach ($request->attributeIds as $value) {
if (isset($request->productAttribute[$value])) {
$productAttributes[] = new ProductAttribute([
'product_id' => $product->id,
'attribute_id' => $value,
'value' => $request->productAttribute[$value],
]);
}
}
$product->ProductAttribute()->saveMany($productAttributes);
$productDetail = [];
foreach ($request->productDetails as $value) {
if (isset($value)) {
$productDetail[] = new ProductDetail([
'description' => $value,
'parent_id' => $product->id,
]);
}
}
$product->ProductDetail()->saveMany($productDetail);
$product_Maintenance = [];
foreach ($request->productMaintenance as $value) {
if (isset($value)) {
$product_Maintenance[] = new ProductMaintenance([
'description' => $value,
'parent_id' => $product->id,
]);
}
}
$product->ProductMaintenance()->saveMany($product_Maintenance);
return back();
}
@endworld
@mhyeganeh
@mohammadphp
@abdolrahman
@erfanmohseni406
@meysampro
@gomnam
درود...
۱. فایل با نام دلخواه TestRequest در قسمت request ایجاد کنید:
return [
'name' => ['required', 'string', 'max:255'],
'slug' => ['required', 'string', 'max:255', 'unique:categories'],
'category_id' => ['nullable', 'exists:categories,id']
];
۲. با فراخوانی کردن TestRequest کد به شکل زیر بنویسید:
public function store(TestRequest $request)
{
Category::create(
$request->validated()
);
$notification = array(
'message' => 'دسته با موفقیت ایجاد شد',
'alert-type' => 'success'
);
return back()->with($notification);
}@endworld
اگر همزمان چند جدول را بخوایم سیو کنیم چی؟
شاید پاسخ شما همینجا باشد
@s.aerospace
در مدل یا کنترلر؟
@endworld
توی کنترلر همونطور که تو کدهای بالا نوشتم
سلام وقت بخیر حتما از DB Transaction ها در عملیات هایی که در چند جدول ذخیره و عملکرد هر کدوم وابسته به هم هستند مثل فانکشن فعلی شما استفاده کنید و میتونید از ریپوزیتوری ها استفاده کنید تا کنترلر خلوت تری داشته باشید
موفق باشید