【问题标题】:Laravel belongsTo relationship depend on parent table columnLaravel 的 belongsTo 关系依赖于父表列
【发布时间】:2021-06-18 18:51:14
【问题描述】:

我有一个用户和一个活动表。一个用户可以有很多活动,一个活动属于一个用户。

用户

id | name | email

活动

id | subject_type | subject_id | description

我无法为活动创建 belongsTo 关系,因为它依赖于 2 列。用户 ID 存储在 subject_id 活动表中,主题类型 = 用户模型。所以它看起来像这样:

id |  subject_type    |  subject_id | description
 1 |  App\Models\User |     2       | some description ... 

现在我想出了:

活动模型

public function user()
{
    return $this->belongsTo(User::class, 'subject_id')
        ->where('subject_type', User::class);
}

但这是错误的,因为 subject_type 在活动列中。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    看起来您需要模型之间的多态关系。

    多态关系允许子模型使用单个关联属于多个类型的模型。例如,假设您正在构建一个允许用户共享博客文章和视频的应用程序。在这样的应用程序中,Comment 模型可能同时属于 Post 和 Video 模型。

    更新用户模型:

    class User extends Model
    {
        // some stuff
     
        public function activities()
        {
            return $this->morphMany(Activity::class, 'subject');
        }
    }
    

    更新 Activity 模型:

    class Activity extends Model
    {
        // do some stuff
    
        public function subject()
        {
            return $this->morphTo();
        }
    
        public function scopeUserType(Builder $builder): Builder
        {
            return $builder->whereSubjectType(User::class);
        }
    }
    

    然后用法:

            // get the activities of a specific user
            $activities = $user->activities;
    
            // get the activities of all users
            $activities = Activity::userType()->get();
    

    更多信息:https://laravel.com/docs/8.x/eloquent-relationships#one-to-many-polymorphic-relations

    【讨论】:

      【解决方案2】:

      为什么您的表格取决于主题类型。那不应该是您的关系列。您应该只有 1 个关系列。然后进行过滤。我还建议将 user_id 列添加到您的活动表中。我在下面这样做了。

      更新活动表

      id | user_id | subject_type | subject_id | description
      

      Activity.php

      public function user()
      {
          return $this->belongsTo(User::class, 'user_id');
      }
      

      在你的控制器中这样称呼它。

      public function index(){
          Activity::with('user' => function($query){
              return $query->where('subject_type', \App\Models\User:class);
          })->get();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 2019-05-26
        • 2020-09-08
        • 2018-03-08
        • 2020-01-15
        • 1970-01-01
        • 2016-11-29
        相关资源
        最近更新 更多