在laravel中,我需要加入模型并仍然使用第一个模型上的方法

时间:2017-12-14 16:01:21

标签: laravel eloquent laravel-5.4 laravel-query-builder spatie

所以我有"用户"模型和"用户设置"模型。 " usersettings" model有一个名为" 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

1 个答案:

答案 0 :(得分:0)

您需要解决一些问题。

  1. 用户 - 用户设置(One - Many Relationship
  2. 您可以认为用户有许多用户设置,用户设置属于用户。

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

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

    在用户设置模型中,您应该定义此inverse relationship

    public function user() {
        return $this->belongsTo('App\User', 'users_id');
    }
    
    1. Querying Relationship
    2. 当您访问关系时,您可以简单地访问该关系,就好像它是一个属性一样。如果您访问usersettings关系,则返回类型为Illuminate\Database\Eloquent\Collection

      $whichuser = \App\User::find($theuserID);
      $userSettings = $whichuser->usersettings;
      
      1. Eager Loading
      2. 您使用with的方式不正确,您应该检查预先加载:

          

        当访问Eloquent关系作为属性时,关系   数据是“延迟加载”。这意味着关系数据不是   实际加载,直到您第一次访问该属性。然而,雄辩   在查询父模型时可以“急切加载”关系。   急切加载缓解了N + 1查询问题。

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

          if ($whichuser2->hasRole('admin')) { ... }