Laravel store multiple value in different row

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

Answers (2)

Dhruv Raval
Dhruv Raval

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

Tharaka Dilshan
Tharaka Dilshan

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

Related Questions