繁体   English   中英

如何在 Laravel 中使用其他表中的列

[英]How to use column from other table in Laravel

在我的导航栏上,我想放置用户头像 每次用户登录他们的帐户时,他们都可以在导航栏上看到自己的姓名和头像。 在此之前,名称头像列在我的用户表中 现在,我将它们移动到针对每种类型的用户(例如买家、承包商和管理员)的其他表。 两个表都使用user_id列相关联。

用户表

id
role
email
password

买家表

id
user_id
name
avatar
email

承包商表

id
user_id
name
avatar
email

导航栏刀片

<a href="#" class="dropdown-toggle" data-toggle="dropdown"><img src="http://localhost:8000/storage/images/{{auth()->user()->avatar}}"class="img-circle" alt="Avatar <span>{{auth()->user()->name}}</span><i class="icon-submenu lnr lnr-chevron-down"></i></a>

我不应该使用{{auth()->user()->avatar}}{{auth()->user()->name}}因为用户表中不再有nameavatar列。 那么,我需要使用什么查询?

这个问题可以通过使用多态关系来解决。 更多关于这里: https : //laravel.com/docs/8.x/eloquent-relationships#one-to-many-polymorphic-relations

如果您的“类型”表中的信息完全相同,您最好只在users表中添加一个名为type列。 此列可以是enum

如果你想保持你当前的方法,多态关系来拯救你!

您应该从您的buyerscontractorsadmins表中删除user_id 相反,您的users表中将有两个多态列。

您的表格应如下所示:

用户表

id
role
email
password
typable_id - integer
typable_type - string

买家表

id
name
avatar
email

承包商表

id
name
avatar
email

管理员表

id
name
avatar
email

您的模型应如下所示:

用户模型

class User extends Model
{
    public function typable()
    {
        return $this->morphTo();
    }
}

买家模式

class Buyer extends Model
{
    public function user()
    {
        return $this->morphMany(User::class, 'typable');
    }
}

承包商模型

class Contractor extends Model
{
    public function user()
    {
        return $this->morphMany(User::class, 'typable');
    }
}

管理模式

class Admin extends Model
{
    public function user()
    {
        return $this->morphMany(User::class, 'typable');
    }
}

您的视图应如下所示:

<a href="#">
    <img src="http://localhost:8000/storage/images/{{auth()->user()->typable->avatar}}">
    <span>{{auth()->user()->typable->name}}</span>
</a>

您可以根据需要添加任意数量的类型,只需添加另一个表和模型。 您的User模型现在是可输入的。


更新:

当您需要创建一个新用户时,首先创建typable ,然后创建具有关系函数的用户:

public function create(Request $request)
{
    $buyer = Buyer::create([
        'name' => $request->name,
        'avatar' => $request->avatar,
        'email' => $request->email,
    ]);

    $buyer->user()->create([
        'role' => 'buyer',
        'email' => $request->email,
        'password' => bcrypt('system'),
        'remember_token' => Str::random(60),
    ]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM