我正在寻找将关系加载到刚刚创建的模型实例中的方法。
例如,我有一个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 :(得分: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);
}
你只需要处理需要创建空对象的情况。