Laravel多对多

文章描述:

Laravel模型多对多查询

数据库

users用户表


SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `users`
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('1', '小明');
INSERT INTO `users` VALUES ('2', '小红');
INSERT INTO `users` VALUES ('3', '小强');

groups分组表


SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `groups`
-- ----------------------------
DROP TABLE IF EXISTS `groups`;
CREATE TABLE `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of groups
-- ----------------------------
INSERT INTO `groups` VALUES ('1', 'A群');
INSERT INTO `groups` VALUES ('2', 'B群');
INSERT INTO `groups` VALUES ('3', 'C群');

group_user关联表


SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `group_user`
-- ----------------------------
DROP TABLE IF EXISTS `group_user`;
CREATE TABLE `group_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_id` tinyint(11) DEFAULT NULL,
  `user_id` tinyint(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of group_user
-- ----------------------------
INSERT INTO `group_user` VALUES ('1', '1', '1');
INSERT INTO `group_user` VALUES ('2', '2', '1');
INSERT INTO `group_user` VALUES ('3', '3', '1');
INSERT INTO `group_user` VALUES ('4', '1', '2');
INSERT INTO `group_user` VALUES ('5', '2', '3');

 

1、目前有user用户表和group分组表

方案一

users表增加group_id

第一种方案知道用户在哪些群,但是不知道群里有哪些用户

 

方案二

groups表增加user_id

结合第一和第二可以解决方向查询,出现新的问题一份关系存放在两个字段里,会提高系统出错的风险,也提高了维护的成本,而且面对稍微复杂的查询会出现问题

 

方案三

新增group_user表,group_user可以轻松正向和反向查询关系,复杂的条件查询也不在话下

新增created_at字段,进组时间

 

模型

user模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;

    protected $table = 'users';
    public $timestamps = false;

    public function groups(){
        return $this->belongsToMany(Group::class,'group_user');
    }
}

group模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Group extends Model{
    use HasFactory;

    protected $table = 'groups';
    public $timestamps = false;

    public function users()
    {
        // 返回组成员
        return $this->belongsToMany(User::class,'group_user');
    }
}

控制器

    public function Test(){
        echo "<pre>";
        $user = User::find(1);
//        print_r($user);
        echo $user->name."<br/>";
        $items = $user->groups;
//        print_r($item);
        foreach($items as $val){
            echo $val->name."<br/>";
        }
        echo "<hr/>";
        // 反过来
        $group = Group::first();
//        print_r($group);
        $itemx = $group->users;
//        print_r($itemx);
        foreach($itemx as $value){
            echo $value->name;
        }
    }

结果:

小明
A群
B群
C群

小明小红
发布时间:2023/03/27

发表评论