首页 > 解决方案 > Laravel 的 belongsTo 关系依赖于父表列

问题描述

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

用户

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 在活动列中。

标签: laraveleloquent

解决方案


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

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

更新用户模型:

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

更新活动模型:

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


推荐阅读