【问题标题】:User with multiple companies (different type)拥有多家公司的用户(不同类型)
【发布时间】:2020-12-14 13:51:30
【问题描述】:

我在 Laravel 中构建了一个应用程序,它是一个简单的 CRUD 应用程序。现在我正在为迁移而苦苦挣扎。

用户属于公司。公司可以有很多用户。

公司类型可以是供应商、客户或内部。 所有 3 种公司类型都有不同的字段。例如

供应商表包含:company_name、incoterm、payment_term、 业务类型...等

客户表包含:公司名称、艺术品、折扣、 target_margin...等

内部表仅包含 company_name、updated_at 和 created_at 字段。

所以所有的都有 company_name 字段,所有其他字段都不同。

当用户登录时,我希望能够识别他是供应商/客户还是内部人员。 我希望能够说 Supplier::find($id)->name 应该返回我的公司名称。 Supplier::find($id)->users 应该返回供应商拥有的所有用户。客户相同,内部相同。

我不确定我是否应该在用户表中设置 user_type 列来声明内部用户供应商/客户,或者我应该怎么做?

我在想这样的事情:

表格

用户:

id
name
last_name
company_type
company_id

供应商:

id
company_name
incoterm
payment_term
business type

客户:

company_name 
artwork
discount 
target_margin

内部:

company_name

用户表示例:

-
id: 1
name: "Aleksandar"
last_name: "Alex"
email: "alex@admin.com"
password: "$2y$10$4cYfe/J71VoCib.esHasWud7ueRHURMmcaqSECBJjNJ.y05qtXYXO"
company_type: "\\App\\Model\\Supplier"
company_id: 1
-
id: 2
name: "Another"
last_name: "User"
email: "user@admin.com"
password: "$2y$10$4cYfe/J71VoCib.esHasWud7ueRHURMmcaqSECBJjNJ.y05qtXYXO"
company_type: "\\App\\Model\\Customer"
company_id: 1
-
id: 3
name: "Internal"
last_name: "User"
email: "user@admin.com"
password: "$2y$10$4cYfe/J71VoCib.esHasWud7ueRHURMmcaqSECBJjNJ.y05qtXYXO"
company_type: "\\App\\Model\\Internal"
company_id: 1

有了这个之后,我可以执行user.company_type::find($id) 之类的操作,我将从供应商/客户或内部获得所有具有给定 $id 的东西。

这是正确的做法吗?如果是,那么我如何从供应商 N 获得所有用户? Supplier::find($id)->users 或将来的 Supplier::find($id)->posts 将需要额外的 eloquent 过滤器,因为用户中的 company_id 可以为 1 表示供应商、客户或内部,如上面的示例。

编辑: 我正在使用 Laravel v6.18.35

【问题讨论】:

  • 你的方法是正确的
  • 你在使用 Eloquent 吗?你用的是什么版本的laravel?您是否已经在使用 polymorphic relations 。将 php 类存储在数据库中对我来说似乎是一种不好的做法,您可能需要使用 morph map 来避免这种情况。
  • @hsibboni 是的,我正在使用 Eloquent。 Laravel v6.18.35。不,我现在没有使用多态关系。老实说,不知道他们。
  • @mare96 的回答应该对你有所帮助,这似乎是要走的路,祝你好运。

标签: php mysql sql database laravel


【解决方案1】:

正如@hsibboni 提到的,您可能需要的是polymorphic relations。

所以你的模型中需要这样的东西:

用户

public function company()
{
    return $this->morphTo('company', 'company_type', 'company_id', 'id');
}

供应商、客户和内部

public function users()
{
    return $this->morphMany(User::class, 'company', 'company_type', 'company_id', 'id');
}

当您在 User 上加载关系 company 时,您将获得该用户的公司,如果您为供应商、客户或内部加载关系 users,您将获得属于他们的用户。

我想这就是你需要的。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多