2017-12-10 1 views
0

내 Laravel5 앱에는 일대 다 (one to many) 서비스와 함께 제공되는 서비스 (이름, 설명, 시작, 종료) '일정 (하루, 시작, 종료).Laravel5 앱, 부모 및 '1 대 다수'하위 개체 저장 방법

Service.php :

class Service extends Model 
{ 
    // 

    protected $fillable = [ 

     'name', 'description', 'begins', 'ends', 'service_schedules' 

    ]; 

    public function service_schedules() 
    { 
     return $this->hasMany('App\ServiceSchedule'); 
    } 
} 

ServiceSchedule.php : I 서비스/스케줄 생성을위한 입력을 수집하기 위해 아래의 양식을 사용

class ServiceSchedule extends Model 
{ 
    // 

    protected $fillable = [ 

     'day', 'begins', 'ends', 'service_id' 

    ]; 
} 

. vue2 코드를 사용하면 각 스케줄에 대한 필드 행을 추가/제거 할 수 있습니다.

form.blade.php :

<div id="app"> 
    <div class="clearfix"></div> 
    <br/> 
    <div class="container"> 
     <div class="col-md-12"> 
      <div class="form-group row"> 
       <label for="name" class="col-sm-2 col-form-label">Name<span style="color:red">*</span></label> 
       <div class="col-sm-6"> 
        {!! Form::text('name', null, array('placeholder' => 'Name','class' => 'form-control')) !!} 
       </div> 
      </div> 

      <div class="form-group row"> 
       <label for="description" class="col-sm-2 control-label">Description<span 
          style="color:red">*</span></label> 
       <div class="col-sm-6"> 
        {!! Form::textarea('description', null, array('placeholder' => 'Description','class' => 'form-control')) !!} 
       </div> 
      </div> 

      <div class="form-group row"> 
       <label for="begins" class="col-sm-2 control-label">From<span style="color:red">*</span></label> 
       <div class="col-sm-6"> 
        {!! Form::date('begins', \Carbon\Carbon::now(), array('placeholder' => 'Begins','class' => 'form-control')) !!} 
       </div> 
      </div> 

      <div class="form-group row"> 
       <label for="ends" class="col-sm-2 control-label">To<span style="color:red">*</span></label> 
       <div class="col-sm-6"> 
        {!! Form::date('ends', \Carbon\Carbon::now()->addMonths(9), array('placeholder' => 'Ends','class' => 'form-control')) !!} 
       </div> 
      </div> 

      <div class="form-group row"> 
       <label for="description" class="col-sm-2 control-label">Schedules<span 
          style="color:red">*</span></label> 
       <div class="col-sm-6"> 
        <table class="table"> 
         <thead> 
         <tr> 
          <th scope="col">Day</th> 
          <th scope="col">Start</th> 
          <th scope="col">Finish</th> 
          <th scope="col">Actions</th> 
         </tr> 
         </thead> 
         <tbody> 
         <tr v-for="(n, index) in rows" v-bind:id="index + 1"> 
          <td> 
           <select class="form-control" v-model="n.day" v-bind:id="'service_schedules[' + index + '][day]'"> 
            <option value="1">Monday</option> 
            <option value="2">Tuesday</option> 
            <option value="3">Wednesday</option> 
            <option value="4">Thursday</option> 
            <option value="5">Friday</option> 
            <option value="6">Saturday</option> 
            <option value="7">Sunday</option> 
           </select> 
          </td> 
          <td><input class="form-control" type="time" v-model="n.start" v-bind:id="'service_schedules[' + index + '][begins]'" /></td> 
          <td><input class="form-control" type="time" v-model="n.finish" v-bind:id="'service_schedules[' + index + '][ends]'" /></td> 
          <td> 
           <button type="button" name="add-schedule" id="add-schedule" class="btn btn-link" 
             v-on:click="addRow(index)"><i class="fa fa-plus fa-1x"></i></button> 
           <button type="button" name="remove-schedule" id="remove-schedule" class="btn btn-link" 
             v-on:click="removeRow(index)"><i class="fa fa-minus fa-1x"></i></button> 
          </td> 
         </tr> 
         </tbody> 

        </table> 
       </div> 
      </div> 

내 ServiceController 현재 성공적으로 저장 양식 입력을 기반으로 새 서비스. ServiceController.php 가기 :

public function store(Request $request) 

    { 

     request()->validate([ 

      'name' => 'required|min:2', 

      'description' => 'required', 

      'begins' => 'required|date', 

      'ends' => 'required|date|after:start_date' 

     ]); 

     Service::create($request->all()); 

     return redirect()->route('services.index') 

         ->with('success','Service created successfully'); 

    } 

내가 Laravel에 새로 온 사람으로

, 나는 나 또한 양식 입력을 기반으로 서비스와 관련된 새로운 일정을 저장하기 위해이 코드를 수정해야합니다 방법을 모르겠어요. 누군가 조언 해 줄 수 있습니까? 또는 다른 사람이 가이드로 사용할 수있는 유사한 예를 참조 할 수 있습니까?

답변

0

몇 가지 문제가 있으며 몇 가지 개선 사항을 강조하겠습니다.

class Service extends Model 
{ 

    protected $fillable = [ 

     'name', 'description', 'begins', 'ends', // [1] 

    ]; 

    public function serviceSchedules() // [2] 
    { 
     return $this->hasMany(ServiceSchedule::class); // [3] 
    } 
} 

[1] 먼저

$fillable의 모든 관계를 포함하지 않아야 [2]를 PSR/2 styleguide을 따르도록 시도해야 필요한 것은 아니지만. Laravel가에 메소드 이름을 변환 할 수 똑똑있는 밑줄 버전 (I 가정 데이터베이스 테이블 이름)

[3] 오자에게 관계 이름

새로운을 만들려면을 피하기 위해 ServiceSchedule::class를 사용하여 모델 인스턴스와 동시에 부모에 관련이 Laravel 정말 간단합니다 :

$service->serviceSchedules()->create($request->all()); 

당신이 일정하지만, 쿼리 빌더하지를 반환 () 함수로 관계를 호출 할 때. 이 빌더는 관계에 대한 모든 것을 이미 알고 있으므로 입력으로 일반 배열을 취하는 create()을 실행하면됩니다. 대신 ServiceSchedule 인스턴스가 이미있는 경우 create() 대신 save()을 사용할 수 있습니다.

어쨌든 모든 일정 인스턴스에 대해 service_id이 설정됩니다.

내가 무엇인가를 명확히해야하는지 알려주세요.

+0

감사합니다. 일정을 저장하는 방법에 대해서는 아직 분명하지 않습니다. 1. Laravel이 저장을 위해 Schedule 개체를 채우는 데 적합한 일정 필드의 ID가 양식에 있습니까? 2. 내 코드에서 $ service 개체가 없으며 Service :: create 만 사용하므로 생성 된 서비스에 연결된 일정을 어떻게 저장합니까? – Christos

+0

Laravel 모델을 사용할 때 ID에 신경 쓸 필요가 없습니다. 위의 코드는 필요한 모든 ID를 생성합니다. – Michael