2014-07-13 18 views
0

我正在尋找將關係加載到剛創建的模型實例中的方式。Laravel4:將關係加載到未保存的新模型實例中?

例如,我有一個ServiceOrder模型,它有三個belongsTo關係。我想讓用戶創建它。在創建期間,他選擇這些關係的值。在選擇時,相關模型的許多屬性會動態加載到視圖中,而不僅僅是id。

如果用戶犯了一個錯誤,我需要將他重定向到帶有錯誤標記的創建屏幕。我的視圖使用關係屬性呈現ServiceOrder模型,就好像它們已加載一樣。下面是一個字段的示例:

{{ ExtForm::groupOpen('symptom_id') }} 
    <label for="symptom_id" class="col-sm-2 control-label">Неисправность</label> 
    <div class="col-sm-10"> 
     <select name="symptom_id" class="form-control" placeholder="Неисправность" data-provide="selectize-select" data-autocomplete-url="{{ route('api.symptoms') }}/" data-autocomplete-url-init data-title-parts="cat3_name" data-render-options-template="#symptom_options_template"> 
      @if($model->device->id) <option value="{{ $model->symptom->id }}" data-data="{{ e($model->symptom->toJson()) }}" selected>{{ $model->symptom->cat3_name }}</option> @endif 
     </select> 
     {{ ExtForm::errors() }} 
     <a class="btn btn-primary btn-xs" href="{{ route('symptom.index', ['select' => true]) }} " data-selectize-control-name = "device_id">Выбрать неисправность</a> 
    </div> 
{{ ExtForm::groupClose() }} 

目前我的解決方案如下。我寫了一個小幫手:

class RelatedModelHelper { 

    /** 
    * @param \Eloquent $model 
    * @param array  $relations Names of classes of related models 
    */ 
    public static function fillRelationsFromInput (\Eloquent $model, array $relations) { 
     foreach ($relations as $relatedModelClass) { 
      $funcName = \Str::snake($relatedModelClass); 
      $key  = $funcName . '_id'; 

      /** @var BelongsTo $belongsTo */ 
      $belongsTo = $model->{$funcName}(); 
      if (\Input::old($key)) { 
       /** @var \Eloquent $relatedModel */ 
       $relatedModel = $relatedModelClass::findOrFail(\Input::old($key)); 
      } else { 
       $relatedModel = new $relatedModelClass; 
      } 
      $belongsTo->associate($relatedModel); 
     } 
    } 
} 

現在預裝的所有關係(如果有的話)控制器這樣的:

public function getCreate() { 

    $model    = new ServiceOrder(); 

    RelatedModelHelper::fillRelationsFromInput($model, [ 
     Device::class, 
     Symptom::class, 
     Customer::class 
    ]); 
    return View::make('service_order.create')->with('model', $model); 
} 

回答

0

答案如下:

只要是你的外國關係將被自動加載:

public function getCreate() { 

    $model    = new ServiceOrder(); 

    $model->customer_id = 1; 
    $model->symptom_id = 1; 
    $model->device_id = 1; 

    return View::make('service_order.create')->with('model', $model); 
} 

而你只是需要處理的情況下,需要創建空的對象。

相關問題