Laravel - 如何根据员工和登录用户获取公司详细信息

Posted

技术标签:

【中文标题】Laravel - 如何根据员工和登录用户获取公司详细信息【英文标题】:Laravel - How to get company detail based on employee and logged user 【发布时间】:2021-09-28 01:24:42 【问题描述】:

在我的 Laravel 8 应用程序中,我有以下模型。

公司

protected $fillable = [
    'id',
    'name',
    'website',
    'company_logo',
    'registration_number',
    'date_established',
    'address',
];

员工

protected $fillable = [
    'id',
    'company_id',
    'user_id',
    'first_name',
    'last_name',
    'other_name',
    'gender',
];

public function company()

    return $this->belongsTo(Company::class,'company_id','id');


public function user()

    return $this->belongsTo(User::class,'user_id','id');

我开始了这个,但在路上卡住了。我想根据登录的用户选择公司详细信息。 company 表应该是主表:

public function getMyCompany()

    try 
        $userId = Auth::user()->id;
        $employeeId = Employee::where('user_id', $userId)->first();
        $company = Company::...;

        return $this->success('Company successfully Retrieved.', [
            'company' => $company
        ]);
     catch (\Exception $e) 
        Log::error($e);

        return $this->error($e->getMessage(), $e->getCode());
    

我如何实现这一点(选择公司的所有详细信息):

$company = Company::...;

制作主模型

【问题讨论】:

所以你想从 Auth::user() 获得公司的详细信息? 这个问题需要更清楚。从模型上看,Employee belongsTo 1 家公司,但您正在尝试检索公司?您是要检索员工所属的公司还是要检索所有公司? @Abishek - 我只检索一家公司。员工属于公司。我只需要为 Employee 找一家公司。公司应该是主要模式。请参阅上述模型中的插图 @user11352561,请确保您使用的变量名称在这种情况下是单数的,我已经编辑了问题以表示这一点,但请记住供您参考,否则这会给人们造成不必要的混淆试图帮助你。如果您尝试为员工检索公司,则它应该是 $company 而不是 $companies。它是一对一的关系 【参考方案1】:

我不确定您是否希望从用户那里获得多家公司,或者只是一家。我不确定的原因是您已经定义了公司和员工之间的 1-1 关系,但看起来您希望 getMyCompany() 返回多个公司。

如果想法是只检索员工工作的一家公司,您可以使用员工的“belongsTo”关系,如下所示:

$company = $employee->company;

由于您已经检索到与经过身份验证的用户相关的员工,并且员工模型具有“公司”-关系。

如果您想一次性完成,可以链接查询:

$company = Employee::where('user_id', Auth::user()->id)
                     ->first()
                     ->company;

【讨论】:

员工属于公司。我只需要为 Employee 找一家公司。公司应该是主要模式。请参阅上述模型中的插图。 @Megadöden,Eager Loading 比懒加载好.. 你说得对,@Abishek。 Employee::with('company')->where(...) 效率更高。【参考方案2】:

为此使用 Eloquent Eager 加载,因为 Employee 模型与 company 具有 belongsTo 关系

public function getMyCompany()

    try 
        $userId = Auth::user()->id;
        $employee = Employee::with('company')->where('user_id',$userId)->first();
        $company = $employee->company
        return $this->success('Company successfully Retrieved.', [
            'company'         => $company
        ]);
     catch(\Exception $e) 
        Log::error($e);
        return $this->error($e->getMessage(), $e->getCode());
    

请参阅:https://laravel.com/docs/8.x/eloquent-relationships#eager-loading 了解 Eager Loading 在 Laravel 中的工作原理

【讨论】:

以上是关于Laravel - 如何根据员工和登录用户获取公司详细信息的主要内容,如果未能解决你的问题,请参考以下文章

根据用户的角色和状态登录laravel

Laravel如何根据用户模型上的额外标志来防止用户登录?

如何让 2 个用户同时登录 Laravel 应用程序

所有者编辑员工时没有参数的Laravel路由

根据用户登录动态更改数据库

LARAVEL & VUE:如何通过 API 请求获取登录用户的 API_TOKEN?