i’m having difficulty attaching images to variants when creating new products. for example a product A with
JavaScript
x
variant A1
color blue
size small
images img1, img2
variant A2
color blue
size medium
image img3 img4
when I save this to the database, img1, img2, img3, img4 goes to both variant A1 and A2 instead of each variant to have its own images. How do I solve this?
here is my controller
JavaScript
public function variants(Request $request)
{
$data = $request->all();
foreach($data['title'] as $key => $value){
if(!empty($value)){
$attribute = new AppVariant;
$attribute->title = $value;
$attribute->size = $data['size'][$key];
$attribute->color = $data['color'][$key];
$attribute->save();
$attributeID = $attribute->id;
if($request->hasFile('image')){
$store_file = [];
$files = $request->file('image');
foreach ($files as $file) {
$images = $file->store('public/photos');
$store_file[] = [
'filename' => $images,
'variant_id' => $attributeID
];
}
ProductsPhoto::insert($store_file);
}
}
}
}
Blade file
JavaScript
<form method="POST" action="{{ route('product.post') }}" enctype="multipart/form-data">
@csrf
@foreach($ColorSizes as $ColorSize)
<div >
<input type="text" name="color[]" value="{{$ColorSize->colorname}}">
<span><input type="text" name="size[]" value="{{$ColorSize->sizename}}"></span>
<input type="text" name="title[]" id="title" value="" placeholder="Enter Title" required/>
<span><input type="file" class="form-control" id="image" name="image[]" multiple/>
</span>
</div>
@endforeach
<button type="Submit" id="btn" class="btn btn-primary">Submit</button>
</form>
Advertisement
Answer
You need to group your form controls so that when they are submitted, you know which images go with each product.
Change your blade to something like this
JavaScript
@foreach($ColorSizes as $ColorSize)
<div >
<input type="text" name="color[{{$loop->iteration}}]" value="{{$ColorSize->colorname}}">
<span><input type="text" name="size[{{$loop->iteration}}]" value="{{$ColorSize->sizename}}"></span>
<input type="text" name="title[{{$loop->iteration}}]" id="title" value="" placeholder="Enter Title" required/>
<span><input type="file" class="form-control" id="image" name="image[{{$loop->iteration}}][]" multiple/>
</span>
</div>
@endforeach
Then your PHP would change to something like this.
JavaScript
public function variants(Request $request)
{
$data = $request->all();
foreach($data['title'] as $key => $value){
if(!empty($value)){
$attribute = new AppVariant;
$attribute->title = $value;
$attribute->size = $data['size'][$key];
$attribute->color = $data['color'][$key];
$attribute->save();
$attributeID = $attribute->id;
if($request->hasFile("image.{$key}")){
$store_file = [];
// Get the correct file array based on key
$files = $request->file("image.{$key}.*");
foreach ($files as $file) {
$images = $file->store('public/photos');
$store_file[] = [
'filename' => $images,
'variant_id' => $attributeID
];
}
ProductsPhoto::insert($store_file);
}
}
}
}
Also, I didn’t test this PHP so you might have to debug this line a little $files = $request->file('image.'.$key);
to make sure it gets you the correct file array.