有没有办法在加载 eloquent 模型时使用用于连接表的字段的“OR”条件在 Laravel 模型上创建关系?
示例表:
user_connections
姓名 | 类型 |
---|---|
id | bigInt|主|自动增量 |
来自_用户_id | 大整数 |
to_user_id | 大整数 |
创建于 | 时间戳? |
更新于 | 时间戳? |
如果我有一个名为
UserConnection
且使用上述表模式的 Laravel 模型,是否有任何方法可以在该模型上定义可以利用 from_user_id
字段 OR to_user_id
字段的关系。
目标是在用户模型上建立名为
userConnections
的关系,该关系可以绑定到任一字段。
所需语法示例:
class User {
...
// THE RELATIONSHIP METHOD NAME TO USE (DOESN'T HAVE TO BE `hasMany`)
public function userConnections(){
return $this->hasMany(
\App\Models\UserConnection::class, /* THE TARGET CLASS TO BE LOADED */
'from_user_id||to_user_id', /* JOIN ON EITHER OF THESE FIELDS */
'id' /* THE ID OF THE USER IN THIS MODEL */
);
}
我知道我可以通过查询来完成此操作并手动加载模型。但我想坚持 Laravel 的关系格式,以便该项目中的其他人可以自然地使用该关系。
如果您的答案是“不要以这种方式构建数据库”,请不要费心回复,因为我无法更改架构。我需要弄清楚如何让它与这个模式一起工作。
我的概念并不像模式那样一成不变,但它应该说明我想要实现的目标。我对任何适用于此数据库模式的解决方案都持完全开放的态度。真的希望其他人遇到类似的问题并且可能有解决方案。
提前感谢所有阅读本文的人。
UserConnection::where(function ($query) {
$query->where('from_user_id', $this->id)
->orWhere('to_user_id', $this->id);
});
public function userConnectionsQuery()
{
return UserConnection::where(function ($query) {
$query->where('from_user_id', $this->id)
->orWhere('to_user_id', $this->id);
});
}
public function getUserConnectionsAttribute()
{
return $this->userConnectionsQuery()->get();
}
这将像这样工作
$user = User::find($userId);
$userConnections = $user->userConnectionsQuery()->get(); # Directly call
$userConnections = $user->userConnectionsQuery()->where('created_at', '>', $someDate)->get(); # Directly call
$userConnections = $user->userConnections; # Dynamic Access