老师,求解,一个是取出来我的关注,一个是取出来我的粉丝,这俩方法不能理解

<?php

namespace App\Models;
.
class User extends Authenticatable
{
    .
    .
    .
    public function followers()
    {
    //这里的user_id是那个表里面的
    //这里的follower_id是哪个表里面的
        return $this->belongsToMany(User::Class, 'followers', 'user_id', 'follower_id');
    }

    public function followings()
    {
        //这里的user_id是那个表里面的
    //这里的follower_id是哪个表里面的
        return $this->belongsToMany(User::Class, 'followers', 'follower_id', 'user_id');
    }
}    

这个关联中的模型是指的哪个??
合并的模型是指的哪个???
方法的第三个参数 user_id 是定义在关联中的模型外键名,而第四个参数 follower_id 则是要合并的模型外键名。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 13
QIN秦同学
 * followers 表
 * id     user_id     follower_id
 * 1       2             3         // 用户3关注了用户2。也就是说用户3是用户2 的粉丝。
 * 2       4             2         // 用户2关注了用户4。也就是说用户2是用户4的粉丝。
 * 3       3             2         // 和第一条相反。两人互相关注。 用户2也是用户3的粉丝。
 *
 *
 * belongsToMany(1,2,3,4)
 * 四个参数意思:
 *  1、目标model的class全称呼。
 *  2、中间表名
 *  3、中间表中当前model对应的关联字段
 *  4、中间表中目标model对应的关联字段
 *
 *   获取粉丝:(重点:这里粉丝也是用户。所以就把User 模型也当粉丝模型来用)
 *  eg: belongsToMany(User::class,'followers','user_id','follower_id');
 *      粉丝表,中间表,当前model在中间表中的字段,目标model在中间表中的字段。
public function followers()
{
    return $this->belongsToMany(User::Class, 'followers', 'user_id', 'follower_id');
}

/**
 *用户关注人列表
 * 关注人列表,关联表,当前model在中间表中的字段,目标model在中间表中的字段。
 */
public function followings(){
    return $this->belongsToMany(User::class,'followers','follwer_id','user_id');
}
5年前 评论
李小明 4年前

file

一个关注关系的话可能会这么定义 中间表 user_follow_user (也就是你这里的follower表?这个表命名做中间表不合适吧)
这个表会定义2个字段 user_id (行为发起人) followed_user_id (行为目标也就是关注的用户)

此时多对多关系就可以这么定义

# User.php
function followers() 
{
    // 第一个user_id 是User.php,也就是当前定义在那个模型中,这个模型对应的表 在 user_follow_user中的外键
    // 第二个followed_user_id 是belongsToMany中第一个参数对应的模型对应的表在user_follow_user这个中间表中对应的关联外键
    // 关于followed_user_id这个命名其实有些违反外键的命名规范(但也属于特殊情况,并且尽量遵守了,总不能在一张表中定义两个user_id吧,mysql会报错的). 
    return $this->belongsToMany(User:class, 'user_follow_user', 'user_id', 'followed_user_id')
}

    // 粉丝只需要掉换两个外键的位置就可以了
    function fans()
    {
         return $this->belongsToMany(User:class, 'user_follow_user', 'followed_user_id', 'user_id')
    }

但是如果这个行为叫用户关注文章,也就是laravel文档中的例子,会比较容易理解多对多模型关联的定义
user_follow_product: user_id, product_id

return $this->belongsToMany(Post:class, 'user_follow_post', 'user_id', 'post_id')

6年前

@Blue-Yu
你好,看一下二楼的文字描述、再看一下这个图应该能理解了、

以下来源:互联网

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。
数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。
file

刚刚画的图有点丑
我是这么理解的
file

6年前

file

一个关注关系的话可能会这么定义 中间表 user_follow_user (也就是你这里的follower表?这个表命名做中间表不合适吧)
这个表会定义2个字段 user_id (行为发起人) followed_user_id (行为目标也就是关注的用户)

此时多对多关系就可以这么定义

# User.php
function followers() 
{
    // 第一个user_id 是User.php,也就是当前定义在那个模型中,这个模型对应的表 在 user_follow_user中的外键
    // 第二个followed_user_id 是belongsToMany中第一个参数对应的模型对应的表在user_follow_user这个中间表中对应的关联外键
    // 关于followed_user_id这个命名其实有些违反外键的命名规范(但也属于特殊情况,并且尽量遵守了,总不能在一张表中定义两个user_id吧,mysql会报错的). 
    return $this->belongsToMany(User:class, 'user_follow_user', 'user_id', 'followed_user_id')
}

    // 粉丝只需要掉换两个外键的位置就可以了
    function fans()
    {
         return $this->belongsToMany(User:class, 'user_follow_user', 'followed_user_id', 'user_id')
    }

但是如果这个行为叫用户关注文章,也就是laravel文档中的例子,会比较容易理解多对多模型关联的定义
user_follow_product: user_id, product_id

return $this->belongsToMany(Post:class, 'user_follow_post', 'user_id', 'post_id')

6年前

@Administrator ,一对多能看明白,这个多对多迷糊

6年前

@Blue-Yu
你好,看一下二楼的文字描述、再看一下这个图应该能理解了、

以下来源:互联网

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。
数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。
file

刚刚画的图有点丑
我是这么理解的
file

6年前

@Max 谢谢老师,完全理解了

6年前

@Administrator 谢谢老师,完全理解了,有图更容易理解了

6年前

你们怎么把phpstorm搞得这么好看的呀 能不能告知一下

5年前

@Blue-Yu 那是什么主题,字号什么的 能把配置发给我么,非常感谢

5年前

@剑歌丶
主题:Material Theme
字号:15px

5年前
QIN秦同学
 * followers 表
 * id     user_id     follower_id
 * 1       2             3         // 用户3关注了用户2。也就是说用户3是用户2 的粉丝。
 * 2       4             2         // 用户2关注了用户4。也就是说用户2是用户4的粉丝。
 * 3       3             2         // 和第一条相反。两人互相关注。 用户2也是用户3的粉丝。
 *
 *
 * belongsToMany(1,2,3,4)
 * 四个参数意思:
 *  1、目标model的class全称呼。
 *  2、中间表名
 *  3、中间表中当前model对应的关联字段
 *  4、中间表中目标model对应的关联字段
 *
 *   获取粉丝:(重点:这里粉丝也是用户。所以就把User 模型也当粉丝模型来用)
 *  eg: belongsToMany(User::class,'followers','user_id','follower_id');
 *      粉丝表,中间表,当前model在中间表中的字段,目标model在中间表中的字段。
public function followers()
{
    return $this->belongsToMany(User::Class, 'followers', 'user_id', 'follower_id');
}

/**
 *用户关注人列表
 * 关注人列表,关联表,当前model在中间表中的字段,目标model在中间表中的字段。
 */
public function followings(){
    return $this->belongsToMany(User::class,'followers','follwer_id','user_id');
}
5年前 评论
李小明 4年前

@echofree313非常感谢您

5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!