【问题标题】:Correct way to set up this Laravel relationship?建立这种 Laravel 关系的正确方法?
【发布时间】:2020-05-13 00:48:34
【问题描述】:

我正在寻求一些逻辑建议。我正在创建一个用户登录并注册他们参与活动的系统。他们可以多次参加一项活动。做这个的最好方式是什么?我想确保我可以使用 eloquent,而不是创建自己的函数。

我在想象……

用户:

id

活动:

id
name

参与:

id
user_id
activity_id
time_at_activity

我希望以后能够做以下事情: $user->participations->where('activity_id', 3) 例如。

最好的设置方法是什么?我想到了..

用户:hasMany->参与

活动:belongsTo->参与

参与:hasMany->Activitys & belongsTo->User

这看起来正确吗?

【问题讨论】:

    标签: php laravel laravel-5 php-7 laravel-6


    【解决方案1】:

    您可以使用Many-to-Many 关系。

    使用Participation 作为您的数据透视表。将关系定义为

    /* in User */
    public function activity()
    {
        return $this->belongsToMany('App\Models\Activitys','participation','user_id','activity_id')->as('participation')->withPivot('time_at_activity');
    } 
    
    /* in Activity */
    public function user()
    {
        return $this->belongsToMany('App\Models\Users','participation','activity_id','user_id')->as('participation')->withPivot('time_at_activity');
    } 
    

    【讨论】:

      【解决方案2】:

      用户模式可以通过称为参与的数据透视表与活动相关:

      /**
       * Indicate that the model belongs to a user.
       *
       * @see \App\Model\User
       *
       * @return BelongsTo
       */
      public function user()
      {
          return $this->belongsTo(User::class);
      }
      
      /**
       * Indicate that the model belongs to many activity participations.
       *
       * @see \App\Model\Activity
       *
       * @return BelongsTo
       */
      public function participations()
      {
          return $this->belongsToMany(Activity::class, 'participations');
      }
      
      $user->participations()->attach($activity);
      

      您可能想要添加互惠关系。这些可以分离成特征以供代码重用。 ->attach(['participated_at' => now()])

      【讨论】:

        【解决方案3】:

        数据库架构

        // App\User
        public function participations()
        {
            return $this->hasMany('App\Participation');
        } 
        // You may create App\Participation Model
        // App\Participation 
        public function user()
        {
            return $this->belongsTo('App\User');
        } 
        
        // Controller
        $userParticipations = $user->participations->where('activity_id', 3);
        // eager loading version
        $userWithParticipations = $user->with(['participations' => function($q) { $q->where('activity_id', 3) }])->get();
        

        【讨论】:

          猜你喜欢
          • 2020-06-28
          • 2014-08-13
          • 1970-01-01
          • 2015-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-20
          相关资源
          最近更新 更多