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
发表评论