在连接字段上使用 OR 条件的 Laravel 关系

问题描述 投票:0回答:1

有没有办法在加载 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 的关系格式,以便该项目中的其他人可以自然地使用该关系。

如果您的答案是“不要以这种方式构建数据库”,请不要费心回复,因为我无法更改架构。我需要弄清楚如何让它与这个模式一起工作。

我的概念并不像模式那样一成不变,但它应该说明我想要实现的目标。我对任何适用于此数据库模式的解决方案都持完全开放的态度。

真的希望其他人遇到类似的问题并且可能有解决方案。

提前感谢所有阅读本文的人。

php mysql laravel foreign-keys relationship
1个回答
0
投票
我不确定。这就是你所要求的吗?

UserConnection::where(function ($query) { $query->where('from_user_id', $this->id) ->orWhere('to_user_id', $this->id); });


您可以将其与 Laravel Attribute 结合起来进行一次调用。

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
    
© www.soinside.com 2019 - 2024. All rights reserved.