Reputation: 49
would you like to help me? I want to input multiple value and store in database with different row. For example :
In input form,
|project_id milestone_id|
| 1 1,2,3 |
| 2 2,4 |
My expected result in database
|project_id milestone_id|
| 1 1 |
| 1 2 |
| 1 3 |
| 2 2 |
| 2 4 |
This is my view (tasktable\projectmiles.blade.php)
<form action="{{route('project-miles.store')}}" method="post">
<label for="project" class="control-label mb-1">Project</label>
<div class="input-group col-lg-12">
<select name="project_id" id="project_id" class="form-control">
<option value="">Please Select</option>
@foreach ($projects as $item)
<option value="{{$item->id}}">{{$item->value}} - {{$item->description}}</option>
@endforeach
</select>
</div>
<label for="milestone" class="control-label mb-1">Milestone</label>
<div class="input-group col-lg-12">
<select multiple="multiple" name="milestone_id" id="milestone_id" class="form-control">
<option value="">Please Select</option>
@foreach ($milestones as $item)
<option value="{{$item->id}}">{{$item->value}} - {{$item->description}}</option>
@endforeach
</select>
</div>
<button type="submit" class="btn btn-lg btn-info btn-block"></button>
</form>
This is my controller (ProjectMilestoneController.php) and I take value from 2 model (Milestone and Project)
class ProjectMilestoneController extends Controller
{
public function index()
{
$projects = Project::get();
$milestones = Milestone::get();
return view('takstable.projectmiles',['projects'=>$projects, 'milestones'=>$milestones]);
}
public function store(Request $request)
{
ProjectMilestone::create($request->all());
return redirect()->route('project-miles.index');
}
}
This is my model (ProjectMilestone.php)
class ProjectMilestone extends Model
{
protected $fillable = ['project_id','milestone_id'];
public function project()
{
return $this->belongsTo(Project::class,'project_id','id');
}
public function milestone()
{
return $this->belongsTo(Milestone::class,'milestone_id','id');
}
}
Thank you in advanced
Upvotes: 2
Views: 5128
Reputation: 1583
You have to make array on view also. ex :
<select name="milestone_id[]" id="milestone_id" class="form-control">
Refer @tharakaDilshan's answer for controller.
Upvotes: 0
Reputation: 4499
The Eloquent
way to achieve this is,
public function store(Request $request)
{
foreach($request->milestone_id as $milestone_id) {
ProjectMilestone::create([
'project_id' => $request->project_id,
'milestone_id' => $milestone_id
]);
}
return redirect()->route('project-miles.index');
}
But this affect the efficiency of the system because if there are n number of milestones selected, there will be n number of queries to the database.
In order to avoid this issue.
public function store(Request $request)
{
$prject_milestone = collect();
foreach($request->milestone_id as $milestone_id) {
$project_milestones->push(
ProjectMilestone::make([
'project_id' => $request->project_id,
'milestone_id' => $miletone_id
])
);
}
DB::table('project_milestones')->insert($project_milestones);
return redirect()->route('project-miles.index');
}
this will execute only one query to the database.
The Choice is yours
Upvotes: 3