php的db类库Eloquent单独使用系列(9)- 多对多关联 - 表关联自身
程序员文章站
2022-07-12 18:20:36
...
我的Eloquent单独使用系列文章
php的db类库Eloquent单独使用系列(1)
php的db类库Eloquent单独使用系列(2) - 分页
php的db类库Eloquent单独使用系列(3) - sql日志
php的db类库Eloquent单独使用系列(4)- 事件监听
php的db类库Eloquent单独使用系列(5)- 模型转数组
php的db类库Eloquent单独使用系列(6)- 一对一关联
php的db类库Eloquent单独使用系列(7)- 一对多关联
php的db类库Eloquent单独使用系列(8)- 多对多关联
php的db类库Eloquent单独使用系列(9)- 多对多关联 - 表关联自身
php的db类库Eloquent单独使用系列(10)- 多对多关联 - 远程一对多
php的db类库Eloquent单独使用系列(11)- 多对多关联 - 添加模型属性
php的db类库Eloquent单独使用系列(12)- 结果集模型转数组 - 2
本系列文章的目的就是脱离laravel环境使用Eloquent,因为它好用。
本系列文章所有代码均测试通过。Eloquent版本:5.4.27
本文的目的是使用多对多关联时,自身关联该怎么做。
首先建表,一个用户可以关注多个用户,也可以被多个用户关注。需建2张表才能满足需求。
源代码
总共2个文件,主程序,用户模型类,
User.php
主程序
浏览器输出
总结:
多写个方法就成了,本示例里是 fans()
php的db类库Eloquent单独使用系列(1)
php的db类库Eloquent单独使用系列(2) - 分页
php的db类库Eloquent单独使用系列(3) - sql日志
php的db类库Eloquent单独使用系列(4)- 事件监听
php的db类库Eloquent单独使用系列(5)- 模型转数组
php的db类库Eloquent单独使用系列(6)- 一对一关联
php的db类库Eloquent单独使用系列(7)- 一对多关联
php的db类库Eloquent单独使用系列(8)- 多对多关联
php的db类库Eloquent单独使用系列(9)- 多对多关联 - 表关联自身
php的db类库Eloquent单独使用系列(10)- 多对多关联 - 远程一对多
php的db类库Eloquent单独使用系列(11)- 多对多关联 - 添加模型属性
php的db类库Eloquent单独使用系列(12)- 结果集模型转数组 - 2
本系列文章的目的就是脱离laravel环境使用Eloquent,因为它好用。
本系列文章所有代码均测试通过。Eloquent版本:5.4.27
本文的目的是使用多对多关联时,自身关联该怎么做。
首先建表,一个用户可以关注多个用户,也可以被多个用户关注。需建2张表才能满足需求。
CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL DEFAULT '' COMMENT '用户名称', age int(11) NOT NULL DEFAULT '0' COMMENT '年龄', PRIMARY KEY (id) ); CREATE TABLE user_follows ( id int(11) NOT NULL AUTO_INCREMENT, to_user_id int NOT NULL DEFAULT 0 COMMENT '被关注人', from_user_id int NOT NULL DEFAULT 0 COMMENT '关注人uid', create_time int not null default 0 comment '关注时间', PRIMARY KEY (id) ) comment "关注表";
源代码
总共2个文件,主程序,用户模型类,
User.php
<?php namespace app\model; use \Illuminate\Database\Eloquent\Model; /** * User模型类 */ class User extends Model { protected $table = 'users'; public $timestamps = false; // 查询我关注了哪些人。 public function follows() { // 重要说明:参数2是关联表名, return $this->belongsToMany('app\model\User', 'user_follows', 'from_user_id', 'to_user_id') ->withPivot('create_time' ); } // 查询我的粉丝 public function fans() { // 重要说明:参数2是关联表名, return $this->belongsToMany('app\model\User', 'user_follows', 'to_user_id', 'from_user_id') ->withPivot('create_time' ); } }
主程序
<?php namespace app\control; use Illuminate\Database\Capsule\Manager; use app\model\User; class Ill4 { /** * 主程序。 */ public function index() { $db = new Manager (); $db->addConnection ( [ 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'test1', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '' ] ); $db->setAsGlobal (); $db->bootEloquent (); $db::delete('delete from users '); $db::delete('delete from user_follows '); foreach (range(1,10) as $v) { $user = new User (); $user->name = '用户'.$v; $user->id = $v; $user->save (); // 新模型添加 } $db::table('user_follows')->insert([ 'from_user_id' => 1, 'to_user_id' => 2, 'create_time' => time(), ]); $db::table('user_follows')->insert([ 'from_user_id' => 1, 'to_user_id' => 3, 'create_time' => time(), ]); $db::table('user_follows')->insert([ 'from_user_id' => 2, 'to_user_id' => 3, 'create_time' => time(), ]); // 用户3关注1和5,用户3被1和2关注。 $db::table('user_follows')->insert([ 'from_user_id' => 3, 'to_user_id' => 1, 'create_time' => time(), ]); $db::table('user_follows')->insert([ 'from_user_id' => 3, 'to_user_id' => 5, 'create_time' => time(), ]); echo "<h4>用户3关注1和5,用户3被1和2关注。</h4>"; echo "<h2>用户3关注的人</h2>"; echo User::find(3)->follows->toJson(JSON_UNESCAPED_UNICODE); echo "<br>"; echo "<h2>用户3的粉丝</h2>"; echo User::find(3)->fans->toJson(JSON_UNESCAPED_UNICODE); echo "<br>"; echo '<br>all ok!'; } }
浏览器输出
总结:
多写个方法就成了,本示例里是 fans()