Laravel - объединение 3 таблиц в Eloquent

Я пытаюсь объединить 3 таблицы в Eloquent, а именно пользователей, отделов и ролей. Пользователь может иметь только один отдел и одну роль. Вот как я определил модели:

модель пользователя:

    public function department(){
        return $this->has_one('Department', 'department_id');
    }

    public function role(){
        return $this->has_one('Role', 'role_id');
    }
}

отдел

<?php
class Department extends Eloquent 
{
    public static $key = 'department_id';
    public static $table = 'sys_departments';
    public static $timestamps = false;

    public function user(){
        return $this->belongs_to('User', 'user_id');
    }
}

роль

class Role extends Eloquent 
{
    public static $key = 'role_id';
    public static $table = 'sys_roles';
    public static $timestamps = false;

    public function user(){
        return $this->belongs_to('User', 'user_id');
    }

    public function transaction(){
        return $this->has_many('Transaction', 'transaction_id');
    }
}

И вот как я обращаюсь к ним в контроллере:

$user = User::with(array('department', 'role'))->where('user_id', '=', 1)->first();
echo $user->department->department;

Это производит эти запросы:

SELECT * FROM `tbl_users` WHERE `user_id` = '1' LIMIT 1
SELECT * FROM `tbl_users` WHERE `user_id` = '1' LIMIT 1
SELECT * FROM `sys_departments` WHERE `department_id` IN ('1')
SELECT * FROM `sys_roles` WHERE `role_id` IN ('1')

Есть идеи?

1 ответ

Решение

Я полагаю, что вы путаете методы взаимоотношений из документов Laravel.

class User extends Eloquent {

 public function phone()
 {
      return $this->has_one('Phone', 'my_foreign_key');
 }
}

Идентификатор my_foreign_key - это имя внешнего ключа в таблице телефонов, и оно ссылается на идентификатор пользователя (владельца отношения). так в вашем случае

public function department(){
    return $this->has_one('Department', 'your_user_id');
}

где your_user_id - это поле, которое вы используете в своей таблице deparments для ссылки на пользователя, которому оно принадлежит. а также в других приведенных вами примерах

в настоящее время вы устанавливаете внешний ключ для ссылки на ту же таблицу, а не на ее владельца.

Другие вопросы по тегам