Laravel 关系的三种方式
Posted
技术标签:
【中文标题】Laravel 关系的三种方式【英文标题】:Laravel relationship in three ways 【发布时间】:2022-01-20 05:11:03 【问题描述】:我想定义一个相当独特的关系,但似乎找不到该关系的名称。
我的数据库结构如下:
user
,填充了与本示例无关的数据
带有user_organisation.user_id
和user_organisation.organisation_id
的user_organisation
表
organisation
,填充了与本示例无关的数据
一个 event
包含一个 event.organisation_id
键
我想定义user
-> events
的关系。或者换句话说:用户所属的组织中的所有事件。
【问题讨论】:
查找 HasManyThrough 感谢回复,我也想到了。但是,这会尝试查找“organisation.user_id”列,该列不存在,因为用户-组织关系很多。 这个怎么样? ***.com/questions/37430217/… 这确实模仿了我正在寻找的行为,但我真的在寻找一个内置的 Laravel 解决方案,所有其他定义“关系”中断关键功能的方法,如paginate
. Laravel 似乎根本不支持这种关系类型,所以我坚持加入。无论如何感谢您的帮助。
在查询生成器中使用自定义函数。您将可以访问通常可以访问的所有内容,但没有“关系”包装器
【参考方案1】:
在您的用户模型中:
public function organisations()
return $this->belongsToMany(Organisation::model, 'user_organisation');
在您的组织模型中:
public function users()
return $this->belongsToMany(User::model, 'user_organisation');
public function events()
return $this->hasMany(Event::model);
在您的事件模型中:
public function organisation()
return $this->belongsTo(Organisation::model);
然后:
$user = User::find(1);
$organisations = $user->organisations;
foreach($organisations as $organisation)
$user_organisation_events = $organisation->events;
或者在你的用户模型中:
public function getAllEvents()
$events = new Collection();
$organisations = $this->organisations;
foreach($organisations as $organisation)
$events[] = $organisation->events();
return $events;
因此 $user->getAllEvents() 应该返回与它们关联的所有组织的所有事件的集合。
编辑:
如果您想要返回一个 eloquent 对象而不是一个集合,您还可以添加一个如下所示的方法:
public function events()
$organisations = $this->organisations;
return Event::query()->whereHas('organisations', function ($query)
$query->where('organisation_id', $organisations->pluck('organisation_id'));
);
【讨论】:
这不允许我调用通常的关系函数,例如paginate()
。是否没有本地 Laravel 关系可以促进我正在寻找的行为?
查看@jschpmr 所做的编辑,它返回一个雄辩的对象,然后您应该能够分页。以上是关于Laravel 关系的三种方式的主要内容,如果未能解决你的问题,请参考以下文章