Laravel 5.4 многократное выпадение на принадлежность к двум пивотам - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь соединить компании, которые используются определенной ролью пользователя.Пользователь с определенной ролью может «работать» для нескольких компаний.Компания может «нанимать» нескольких пользователей.У меня есть 5 таблиц (пользователи, role_user, роли, компании и company_user)

Отношения моделей:

App\User:

public function roles()
    {
        return $this
            ->belongsToMany('App\Role')
            ->withTimestamps();
    }


    public function companies()
    {
        return $this
            ->belongsToMany('App\Company')
            ->withTimestamps();
    }


App\Role:
    public function users()
    {
        return $this
            ->belongsToMany('App\User')
            ->withTimestamps();
    }


App\Companies:
    public function users()
    {
        return $this->belongsToMany('App\User');  // with user_role ??
    }

Контроллер компаний

public function edit(Request $request, $id) {

$company = Company::findOrFail($id);

$users = User::where('role_id',4)->pluck('username')->all(); // no role_id column
$users = User::pluck('username','id')->all();  // returns all users

return view('companies.edit', compact(['company','users']));
}

public function update(Request $request, $id) {
    /* TODO */
}

Редактировать представление

{!! Form::select('users[]', $users, null, ['class' => 'form-control', 'multiple' => 'multiple']) !!}

Я хочу назначить пользователей с определенной ролью пользователя для этих компаний.Есть ли способ установить отношение или, возможно, область?

Бонусный вопрос :) Есть ли простой способ отобразить объединенное значение в раскрывающемся списке?Имя + Фамилия вместо имени пользователя?

1 Ответ

0 голосов
/ 31 мая 2018

Возможно, не самое аккуратное решение, но, похоже, оно работает:)

Модель

public function scopeOfRole($query, $role) {
    return $query->
    join('role_user', 'role_user.user_id', '=', 'users.id')->
    join('roles', 'roles.id', '=', 'role_user.role_id')->
    select(
        DB::raw('GROUP_CONCAT(users.first_name," ",users.last_name) as username'),
            'users.id')->
    where('roles.name', $role)->
    groupBy('users.id');
}

Контроллер

public function edit(Request $request, $id) {

$company = Company::findOrFail($id);
$users = User::OfRole('my role')->pluck('username','users.id')->all();

return view('companies.edit', compact(['company','users']));
}

правка

{!! Form::select('users[]', $users, $company->users()->pluck('users.id'), ['class' => 'form-control', 'multiple' => 'multiple']) !!}
...