【问题标题】:Query same table with pivot table使用数据透视表查询同一张表
【发布时间】:2017-02-20 15:03:49
【问题描述】:

我有以下表格:

users - id、用户名等
conversations - id、私人等
conversation_user - id、 user_id,conversation_id

conversation_user 表中针对每个打开/开始的对话有两条记录(如果对话是多用户的,则可能更多)。 一个用户作为收件人/收件人,另一个用户作为发件人。假设:user_id=1conversation_id=1user_id=2conversation_id=1

如何选择与我进行公开对话的所有用户/用户名。确切地说,所有参与者。

我假设我需要获取我参与的对话 ID,然后对对话中的其他用户进行反向查找。但到目前为止还没有运气......这个反向查找是我卡住的地方。 我正在使用 Laravel 5.3 和 MySQL。

【问题讨论】:

    标签: mysql laravel pivot


    【解决方案1】:

    首先,您需要在数据透视表上使用has_started_conversation 类型的布尔值conversation_user

    docs 中所述,您需要定义ConversationUser 模型之间的关系。

    用户

    class User extends Model
    {
        public function conversations()
        {
            return $this->belongsToMany('App\Conversation')->withPivot('has_started_conversation');
        }
    }
    

    对话

    class Conversation extends Model
        {
            public function users()
            {
                return $this->belongsToMany('App\User')->withPivot('has_started_conversation');
            }
        }
    

    然后

    //  get a users conversations
    $conversations = \App\User::first()->conversations;
    // select a single conversation, or maybe multiple with a for loop?
    $important_conversation = $conversations->random();
    // get the participants of that conversation
    $participants = $important_conversation->users;
    

    【讨论】:

    • 我真的需要那个布尔值吗?当我开始对话时,它会自动在对话和对话用户表中创建记录。对话 ID 是所有参与者之间的连接,也是对话已经开始的证明,恕我直言......
    • 您可以依赖会话中附加的第一个用户,但随后您需要跟踪时间戳。这是你的选择。
    猜你喜欢
    • 2017-12-19
    • 2022-11-02
    • 1970-01-01
    • 2018-11-05
    • 2015-09-30
    • 2014-01-07
    • 2018-12-08
    • 2018-11-11
    • 2019-07-22
    相关资源
    最近更新 更多