Laravel красноречивая модель отношений - PullRequest
0 голосов
/ 07 сентября 2018

Мое приложение основано на

Laravel: 5.6.35
PHP 7.2.4
Entrust: 1.9

Моя ролевая модель

class Role extends EntrustRole
{
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

    public function users()
    {
        return $this->hasMany(User::class);
    }
}

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

class User extends Authenticatable
{
    public function role()
    {
        return $this->belongsTo(Role::class);
    } 
}

А теперь вы можете заметить в Тинкере

D:\work\www\myapp>php artisan tinker
Psy Shell v0.9.7 (PHP 7.2.4 — cli) by Justin Hileman
>>> App\models\Role::find(1)->users()->get()
Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.role_id' in 'where clause' (SQL: select * from `users` where `users`.`role_id` = 1 and `users`.`role_id` is not null)'
>>> App\User::find(1)->role()->get();
=> Illuminate\Database\Eloquent\Collection {#2937
     all: [],
   }
>>> App\User::find(1)->roles()->get();
=> Illuminate\Database\Eloquent\Collection {#2941
     all: [
       App\models\Role {#2930
         id: 1,
         name: "super-admin",
         display_name: "Super Admin",
         description: "This will be one permission, that can not be assigned or modified.",
         created_at: "2018-09-07 12:11:35",
         updated_at: "2018-09-07 12:11:35",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#2927
           user_id: 1,
           role_id: 1,
         },
       },
     ],
   }

Я получаю результат для App\User::find(1)->roles(), но моя модель User имеет функцию role(), пустую коллекцию для App\User::find(1)->role() и ошибку для App\models\Role::find(1)->users()

поэтому, пожалуйста, дайте некоторое представление, как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Я думаю, что нашел ответ на свой вопрос здесь .Если вы правильно определили отношения через hasMany и serveTo в своих моделях, но не указали внешний ключ в таблице модели, которая принадлежит другим стол, ваши отношения не будут работать. В документации также предлагается использовать foreign_key для использования отношения Один-ко-многим .

Дизайн базы данных Entrust основан на отношениях «многие ко многим». Таким образом, этот пользователь может иметь несколько ролей. Чисто, как описано в документации Laravel .

0 голосов
/ 07 сентября 2018

Проблема либо в том, как создаются ваши отношения, либо в вашей таблице, ошибка говорит:

 Unknown column 'users.role_id' in 'where clause'

это означает, что в вашей таблице пользователей отсутствует столбец role_id, когда вы создаете отношения типа

public function users()
{
    return $this->hasMany(User::class);
}

hasMany попытается найти tablename_id в модели, которую вы передаете, если вы хотите получить их по третьей таблице, вы можете использовать belongsToMany в вашей permission модели или полиморфные отношения

0 голосов
/ 07 сентября 2018

Как вы определили свои отношения, вы должны явно попросить восстановить это отношение:

App\User::with('Roles')->find(1)->roles()

В документации отношение между пользователем и ролью выглядит следующим образом:

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\User');
    }
}

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}

Таким образом, вам не нужно просить об отношениях

...