Laravel:将关系加载到未保存的新模型实例中?

时间:2014-07-13 14:16:32

标签: laravel laravel-4 eloquent

我正在寻找将关系加载到刚刚创建的模型实例中的方法。

例如,我有一个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);
}

1 个答案:

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

你只需要处理需要创建空对象的情况。