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

Posted

技术标签:

【中文标题】在 laravel 中,我需要加入模型并仍然使用第一个模型上的方法【英文标题】:In laravel I need to join to models and still use the methods on the first model 【发布时间】:2018-05-28 18:58:02 【问题描述】:

所以我有“用户”模型和“用户设置”模型。 “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 包中的方法。

谢谢 回复

【问题讨论】:

【参考方案1】:

您需要解决一些问题。

    用户 - 用户设置 (One - Many Relationship)

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

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

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

在用户设置模型中,你应该定义这个inverse relationship:

public function user() 
    return $this->belongsTo('App\User', 'users_id');

    Querying Relationship

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

$whichuser = \App\User::find($theuserID);
$userSettings = $whichuser->usersettings;
    Eager Loading

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

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

    角色/权限

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

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

【讨论】:

以上是关于在 laravel 中,我需要加入模型并仍然使用第一个模型上的方法的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 加入 Auth 表

Laravel - 第 3 方 API 的模型?

Laravel Eloquent关于加入关系的条款

如何通过 laravel eloquent 模型 Laravel 5 加入三个表

Laravel Eloquent 从一个表中选择并在另一个表中有匹配项时加入第一行

Laravel 中数据库查询构建器的位置