Laravel 5 — выполнение соединения с таблицами базы данных

У меня есть пара таких схем

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('userName')->default('');
    $table->string('userEmail')->default('');
    $table->tinyInteger('active')->default(1);
    $table->integer('departmentId')->unsigned()->default(0);
    $table->foreign('departmentId')->references('departmentId')->on('departments')->onDelete('cascade');
    $table->timestamps();
});

Schema::create('departments', function (Blueprint $table) {
    $table->primary('departmentId');
    $table->integer('departmentId')->unsigned()->default(0);
    $table->string('departmentName')->default('');
    $table->tinyInteger('active')->default(1);
    $table->timestamps();
});

Таким образом, пользователь принадлежит отделу, а у отдела может быть много пользователей.

В одном из моих контроллеров я использую следующее, чтобы получить список пользователей для определенного отдела.

$users = User::select('userName', 'id')->where('departmentId', 2)->get();

Поскольку я получаю отделы из Active Directory, с тех пор я обнаружил, что это не очень хороший способ, поскольку идентификаторы отделов меняются. Таким образом, теперь мне нужно получить пользователей через DepartmentName. На данный момент я пытаюсь что-то вроде этого

$test = DB::table('users')
        ->join('departments', 'users.departmentId', '=', 'departmentId')
        ->select('users.userName', 'users.id')
        ->get();

Однако это возвращает следующую ошибку

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'departmentId' in on clause is ambiguous (SQL: select `users`.`userName`, `users`.`id` from `users` inner join `departments` on `users`.`departmentId` = `departmentId`)

Как можно было бы получить всех пользователей для определенного DepartmentName? Итак, скажем, я хотел получить всех пользователей, принадлежащих к технологическому отделу, как я мог это сделать?

Спасибо


person katie hudson    schedule 22.02.2016    source источник


Ответы (1)


Вы пропустили имя таблицы отделов, поэтому sql отобразил идентификатор отдела как неоднозначный, поскольку его можно найти как в таблице пользователей, так и в таблице отделов. Ваш запрос должен быть таким.

$test = DB::table('users')
    ->join('departments', 'users.departmentId', '=', 'departments.departmentId')
    ->select('users.userName', 'users.id')
    ->get();

но если вы хотите фильтровать по имени отдела, вам следует добавить предложение where, подобное этому

 $test = DB::table('users')
    ->join('departments', 'users.departmentId', '=', 'departments.departmentId')
    ->select('users.userName', 'users.id')
    ->where('departments.departmentName', "department name goes here")
    ->get();
person oseintow    schedule 22.02.2016