【问题标题】:Laravel Relation for different User types不同用户类型的 Laravel 关系
【发布时间】:2017-04-21 17:02:52
【问题描述】:

我有一个平台,我的用户是商店,他们可以下订单,我的用户是供应商,他们可以查看下订单。

现在我遇到了一些逻辑问题,例如在我的用户类中,我希望供应商能够做到这一点

Auth::user()->orders

但是作为商店的用户也应该能够做到这一点

Auth::user()->orders

我在这里举例说明了如何做到这一点:

class User extends Authenticatable
{
  public function orders()
  {
      return $this->hasMany(Order::class, 'created_by');
  }

  public function alsoHasOrders()
  {
      return $this->hasMany(Order::class, 'fulfilled_by');
  }

}

应该有更好的方法来做到这一点吗?

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    首先,我建议您重新设计数据模型。您的用户模型是您的身份验证器,这就是它应该关注的全部。它也不应该是商店或供应商,或其他任何东西。供应商和商店应该是各自“拥有”用户的不同模型。

    您目前的行为违反了 S.O.L.I.D.就像这里对您问题的大多数答案一样。特别是 O 或 Open 用于扩展,关闭用于修改。例如,如果用户是商店和供应商怎么办?如果稍后您还添加了一个分发器类型怎么办?您必须回到该模型并添加更多 if/else 语句、更多类型的关系等......

    相反,我会考虑拥有“商店”和“供应商”角色以及具有用户的不同商店和供应商模型,其中一个或两个都可以分配给用户。完成身份验证后,您可能已经拥有 User 对象,因此在此之后,您可以使用服务检索 Shop 和 Supplier 信息,该服务基于用户分配的角色。

    一些基本实现的快速 sudo 代码:

    class ShopService
    {
      public function listOrders(User $user)
      {
        if ($user->hasRole('shop')) {
          return Shop::with('orders')->where('user_id', $user->id)->get()
        }
    
        return null;
      }
    }
    
    class SupplierService
    {
      public function listOrders(User $user)
      {
        if ($user->hasRole('supplier')) {
          return Supplier::with('orders')->where('user_id', $user->id)->get()
        }
    
        return null;
      }
    }
    

    这意味着您可以通过添加“分发者”角色和分发服务来非常轻松地扩展它

    但是,如果您仍然决心走这条路,至少我建议您仍然有不同的 Shop 和 Supplier 模型,每个模型都扩展基本 User 模型,然后在每个模型中应用相关关系。

    例如:

    class User extends Authenticatable
    {
       ... user stuff
    }
    
    class Shop extends User
    {
      public function orders()
      {
          return $this->hasMany(Order::class, 'created_by');
      }
    }
    
    class Supplier extends User
    {
      public function orders()
      {
          return $this->hasMany(Order::class, 'fulfilled_by');
      }
    }
    

    【讨论】:

      【解决方案2】:

      关于身份验证,看一下使用守卫:https://laravel.com/docs/5.4/authentication

      至于你的user()->orders 想法,我建议user()->fulfilled()user()->supplied()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 2018-12-29
        • 2018-12-24
        • 2017-04-02
        • 2018-09-17
        相关资源
        最近更新 更多