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);
}