1

所以我有“用户”模型和“用户设置”模型。“usersettings”模型有一个名为“users_id”的列,用于将其链接回用户模型。

我正在使用 spatie 权限和角色模块...

所以在用户模型中我有

use Spatie\Permission\Traits\HasRoles;


class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
    use HasRoles;
......
public function usersettings()
    {
        #return $this->hasOne('\App\usersettings','users_id');
        return $this->belongsTo('\App\usersettings','users_id');
    }
}

在我的用户设置模型中

namespace App;

use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasRoles;

class usersettings extends Model
{
    use HasRoles;

    protected $guard_name = 'web'; // or whatever guard you want to use
        protected $table = 'usersettings';

        protected $fillable = [
        'users_id','stripe_customer',
    ];

    //
}

在我的控制器中,我有

public function chooseUser(Request $request){

        $theuserID = $request->input('id');
        \Log::info('The User ID:'.$theuserID);
        $whichuser = \App\User::find($theuserID)->with('usersettings')->get();
        $whichuser2 = \App\User::find($theuserID);

        /*if($isadmin = $whichuser2->hasRole('admin')){
            $whichuser->admin ='isadmin';
        }*/

        #\Log::info('THE HAVE:'.$isadmin);

        \Log::info('THE USER:'.$whichuser);
        #$roles = $whichuser->getRoleNames();
        #\Log::info('THE USER:'.$roles);

        return $whichuser;
    }

我的目标是返回所有用户信息以及用户设置以及查找用户是否具有管理员角色。我一直无法弄清楚如何将这三个放在一起。

我在想它可能是一个连接而不是一个实际,但是我不再有一个 uUser 模型并且不能使用spatie包中的方法。

谢谢R

4

1 回答 1

0

这是您需要解决的一些问题。

  1. 用户 - 用户设置(一对多关系

你可以认为用户有很多用户设置,用户设置属于用户。

在用户模型中,您应该定义这种关系:

public function usersettings() {
    return $this->hasMany('\App\usersettings', 'users_id');
}

在用户设置模型中,您应该定义这种反向关系

public function user() {
    return $this->belongsTo('App\User', 'users_id');
}
  1. 查询关系

当您访问关系时,您可以简单地访问关系,就好像它是一个属性一样。如果您访问 usersettings 关系,则返回类型为Illuminate\Database\Eloquent\Collection

$whichuser = \App\User::find($theuserID);
$userSettings = $whichuser->usersettings;
  1. 急切加载

with以不正确的方式使用,您应该检查急切加载:

当访问 Eloquent 关系作为属性时,关系数据是“延迟加载”的。这意味着在您第一次访问该属性之前,不会实际加载关系数据。但是,Eloquent 可以在查询父模型时“预先加载”关系。急切加载缓解了 N + 1 查询问题。

  1. 角色/权限

这是检查用户是否具有特定角色的正确方法。您应该完整阅读spatie/laravel-permission以了解它们的用法。

if ($whichuser2->hasRole('admin')) { ... }
于 2017-12-14T17:09:05.363 回答