laravel - 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 在活动列中。
解决方案
看起来您需要模型之间的多态关系。
多态关系允许子模型使用单个关联属于多于一种类型的模型。例如,假设您正在构建一个允许用户共享博客文章和视频的应用程序。在这样的应用程序中,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
推荐阅读
- reactjs - create-react-app 无法创建应用程序。它只是创建了 package.json、package-lock.json 和 node 模块并卡在如下所示:
- java - “http://localhost:4200”已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头
- c - 将 char 子数组转换为整数
- javascript - 如何根据百分比调整窗口内宽?
- git - 如何将“repo init/sync”迁移到“git”服务器?
- c - 为什么两个进程(父子进程)都指向相同的代码和数据段?
- amazon-web-services - 为什么 Chrome 从 AWS CloudFront 分配中看到 SSL 但看不到 firefox 或 edge
- node.js - Sequlize连接两个具有相同外键的表
- mysql - 如何在计划的时间限制到期时从节点中删除 MySQL DB 中的数据
- android - Expo SDK 38:Facebook 安装跟踪和 Branch.io AAID 跟踪在 Android 迁移后被破坏