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

我有两张桌子

  1. 用户表
    id
    name
    ...
  1. 聊天表
    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');
}

【问题讨论】:

    标签: laravel eloquent model relationship eager-loading


    【解决方案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 上有不同的用户,您就不能这样做。除非您愿意删除具有不同用户的帖子。
    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2018-03-16
    • 2014-01-13
    • 2014-07-30
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多