Laravel 一对多关系与 2 个主键

Posted

技术标签:

【中文标题】Laravel 一对多关系与 2 个主键【英文标题】:Laravel One to Many relation with 2 primary keys 【发布时间】:2020-01-31 03:13:25 【问题描述】:

我有两张桌子

    用户表
    id
    name
    ...
    聊天表
    id
    from_id // fk - id on users, the user sent the message
    to_id   // fk - id on users, intended user
    message_body

现在,我正在尝试建立一对多关系,其中用户有很多聊天消息,但聊天消息有两个用户。 来自用户

如何定义这种关系?我必须用户急切加载。

我尝试使用Compoships,但没有成功。 我的代码

用户模型

public function chats() 
    return $this->hasMany(Chat::class, ['from_id', 'to_id'], 'id');

聊天模型

public function user() 
    return $this->belongsTo(User::class, ['from_id', 'to_id'], 'id');

【问题讨论】:

【参考方案1】:
public function chats() 
  return $this->hasMany(Chat::class, 'from_id', 'id') + $this->hasMany(Chat::class,'to_id','id');


public function userFrom() 
  return $this->belongsTo(User::class, 'from_id', 'id');


public function userTo() 
  return $this->belongsTo(User::class, 'to_id', 'id');

【讨论】:

请尝试通过几个字符让其他人了解你做了什么以及它是如何工作的【参考方案2】:

你为什么不这样做呢?

在您的用户模型上,像这样设置两个关系:

public function chatsFrom() 
    return $this->hasMany('App\Chat', 'from_id');


public function chatsTo() 
    return $this->hasMany('App\Chat', 'to_id');

然后,在您的 Chat 模型上,还设置两个关系,一个到 from,另一个到 to,两者都引用一个 User 模型。像这样:

public function fromUser() 
    return $this->belongsTo('App\User', 'from_id');


public function toUser() 
  return $this->belongsTo('App\User', 'to_id');

这样,您可以使用以下方式访问关系:

$user->chatsFrom();
$user->chatsTo();

$chat->fromUser();
$chat->toUser();

【讨论】:

我想过,但我想做$user->chats()->delete();this之类的事情。 @APu 但如果您在一次聊天中在fromto 上有不同的用户,您就不能这样做。除非您愿意删除具有不同用户的帖子。

以上是关于Laravel 一对多关系与 2 个主键的主要内容,如果未能解决你的问题,请参考以下文章

Laravel一对多关系问题与学分名称

Laravel 一对多关系和一对一关系

一对多和一对多的关系 laravel

Laravel 5 删除一对多关系

Laravel 5.8 在数据透视表上保存一对多关系

Laravel:belongsTo()关系假设一对多关系而不是一对一