Как автоматически заполнить поле лезвия из красноречивого отношения модели?

Синопсис

У меня есть две модели с отношениями M:M через сводную таблицу. Модель User и модель Group — многие пользователи могут принадлежать многим группам — и наоборот.

Как я могу автоматически заполнить свой множественный выбор в лезвии? Кроме того, действительно ли необходимо всегда реализовывать $user->groups()->lists('id')?

Мой текущий фрагмент (работает, но ИМО противен)

<div class="form-group">
    {{ Form::label('groups', 'Groups') }}
    {{ Form::select('groups[]', $groups, Input::old('groups', $user->groups()->lists('id')), ['class' => 'form-control', 'multiple']) }}
</div>

person ash    schedule 03.05.2014    source источник
comment
Как вы передаете данные модели?   -  person The Alpha    schedule 03.05.2014
comment
$user->groups()->sync(Input::get('groups', [])); выполняется в моем действии postSave. Я загружаю модель с: User::with('groups')->findOrFail($userId); - где $userId анализируется через маршрут в качестве параметра.   -  person ash    schedule 03.05.2014
comment
Итак, вы хотите автоматизировать популяцию или это не работает?   -  person The Alpha    schedule 03.05.2014
comment
Да - хотелось бы автоматизировать популяцию, которая не работает - если только вручную не сделать это: Input::old('groups', $user->groups()->lists('id')) внутри Form::select()   -  person ash    schedule 03.05.2014
comment
Вы должны использовать этот код в своем представлении, но вы можете автоматизировать вставку данных в представление.   -  person The Alpha    schedule 03.05.2014
comment
@WereWolf-TheAlpha приветствует информацию :)   -  person ash    schedule 03.05.2014


Ответы (1)


Чтобы автоматизировать заполнение multi select в view, вы можете создать View::composer(), который будет автоматически передавать данные в представление каждый раз, когда вы загружаете представление. Вы можете создать такой View::composer, используя что-то вроде этого:

View::composer('viewname', function($view)
{
    $user = User::with('groups')->findOrFail($userId);
    $view->with('user', $user);
});

Теперь каждый раз, когда вы загружаете это представление, используйте что-то вроде этого:

return VIew::make('viewname');

Данные ($user) будут переданы в представление (viewname), и если у вас есть код для заполнения multi-select в вашем представлении, он будет заполнен автоматически. В представлении вы можете использовать что-то вроде этого:

{{ 
    Form::select(
        'groups[]',
        $user->groups,
        Input::old('groups', $user->groups()->lists('id')),
        ['class' => 'form-control', 'multiple']
    )
}}
person The Alpha    schedule 03.05.2014