`
xieye
  • 浏览: 830855 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

php的db类库Eloquent单独使用系列(9)- 多对多关联 - 表关联自身

    博客分类:
  • PHP
阅读更多
我的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张表才能满足需求。
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()
  • 大小: 24.5 KB
0
0
分享到:
评论

相关推荐

    Laravel开发-eloquent-uuid-for-key

    1. **安装扩展包**:通常我们可以使用`spatie/laravel-eloquent-has-many-deep`这个扩展包,它为Eloquent提供了对UUID的支持。通过Composer安装: ``` composer require spatie/laravel-eloquent-has-many-deep `...

    Laravel开发-eloquent-single-state-marking-store

    此外,Eloquent还提供了查询构建器,用于构建和执行SQL查询,以及关系(Relationships)功能,用来处理一对多、一对一、多对多等复杂的数据库关联。 单一状态标记存储(Single State Marking Store)是一种设计模式...

    Laravel开发-eloquent-extended-cast-model

    Eloquent-Extended-Cast-Model库正是对这一特性的扩展,它使得开发者可以创建自定义的类型转换器,这些转换器可以处理更复杂的数据格式,如JSON、数组、甚至是其他自定义的序列化和反序列化逻辑。这在处理非标准数据...

    Laravel开发-eloquent-log-lazy-loading

    例如,如果我们有一个`User`模型,它有一对多的`posts`关系,我们可以通过以下方式获取用户及其文章: ```php $user = User::find(1); foreach ($user-&gt;posts as $post) { // ... } ``` 当第一次访问`$user-&gt;posts...

    Laravel开发-eloquent-single-table-inheritance

    - 首先,你需要创建一个基础模型类,通常命名为`BaseModel`,并指定与之关联的数据库表。 - 然后,为每种类型创建一个子模型,如`UserModel`, `AdminModel`等,它们都继承自`BaseModel`。 - 在每个子模型中,可以...

    Laravel开发-eloquent-extended-cast-model .zip

    Eloquent ORM使得开发者能够使用PHP类和对象来操作数据库表,大大简化了数据交互的过程。这个压缩包“Laravel开发-eloquent-extended-cast-model .zip”很可能包含了一些关于如何扩展Eloquent模型的自定义类型转换...

    Laravel开发-eloquent-model-generator

    通过定义模型类,我们可以定义与数据库表的映射关系,比如表名、主键以及关联等。Eloquent提供了一些预定义的方法,如`save()`, `update()`, `delete()`, `find()`等,使得数据库操作变得非常简洁。 描述中提到的...

    Laravel开发-laravel-eloquent-mysqli

    【Laravel 开发 - Laravel Eloquent Mysqli】 在 Laravel 框架中,Eloquent ORM 是一个强大的工具,用于处理数据库操作。它提供了一个简洁、优雅的 PHP ActiveRecord 实现,使得开发者可以方便地进行数据库交互。...

    php一些比较常用类库及例子

    以上只是PHP开发中常用类库的一部分,实际开发中还有更多优秀的类库,如Laravel的Eloquent ORM、Guzzle HTTP客户端库等,它们极大地提高了开发效率和代码质量。了解并熟练使用这些类库,将使你的PHP开发工作更加...

    ros2-eloquent-20191122-windows-release-amd64.zip

    ROS是一个用于在不同进程间匿名的发布、订阅、传递信息的中间件。 ROS2系统的核心部分是ROS网络(ROS Graph)。ROS网络是指在ROS系统中不同的节点间相互通信的连接关系。 ROS Graph这里翻译成了ROS网络,因为我觉得...

    Laravel开发-eloquent-base-model

    - `hasManyThrough`:定义通过中间表建立的多对多关系。 - `morphOne`, `morphMany`, `morphTo`:支持多态关联。 5. **查询构建器**: - 基于查询构建器,Eloquent提供了链式调用的方法,如`where`, `orWhere`, ...

    Laravel开发-eloquent-sortable

    模型类包含一系列的属性和方法,用于定义与数据库表的关联和操作。通过模型,我们可以执行CRUD(创建、读取、更新、删除)操作,以及更复杂的查询。 "eloquent-sortable"库是基于Eloquent的,它添加了一个特性,使...

    Laravel开发-eloquent-search-map

    此外,Eloquent Search Map还支持对关联模型的搜索。如果你的模型之间有父子关系,可以指定要搜索的关联模型和字段,这样在查询时会同时考虑父模型和子模型的字段。 总的来说,Eloquent Search Map通过提供一个统一...

    Laravel开发-laravel-eloquent-filter

    Eloquent Filter是Laravel社区中广泛使用的一个扩展,它允许我们根据输入的筛选器动态地对Eloquent查询进行过滤,从而实现更加灵活的数据检索功能。本文将深入探讨Laravel Eloquent Filter的相关知识点,帮助开发者...

    Laravel开发-eloquent-custom

    通过定义一对一、一对多、多对多等关系,可以方便地获取关联数据。例如,定义一个`hasMany`关系: ```php public function posts() { return $this-&gt;hasMany(Post::class); } ``` 4. **事件系统**:Eloquent模型...

    Laravel开发-eloquent-state-machine

    在Laravel框架中,Eloquent ORM(对象关系映射)是用于数据库操作的强大工具,而“Eloquent State Machine”则是Eloquent模型上的一个扩展,它引入了状态管理的概念,使得对象的状态转换更加有序和可维护。...

    Laravel开发-eloquent-postgres-uuids

    5. **使用Eloquent操作数据**: 现在你可以像平常一样使用Eloquent来创建、读取、更新和删除记录,Eloquent会自动处理UUID的生成和验证。 在实际应用中,可能还需要处理UUID与其他系统之间的交互,如API请求或数据...

    Laravel开发-eloquent-mongodb-repository

    首先,我们需要安装Jenssegers/Laravel-MongoDB扩展包,这个扩展提供了Eloquent模型对MongoDB的支持。通过Composer可以在项目中添加此依赖: ```bash composer require jenssegers/mongodb ``` 安装完成后,我们...

    Eloquent Relationships 表关联

    Laravel官方文档讲解,该资料是一整套视频,需要逐个下载,Eloquent Relationships 表关联

Global site tag (gtag.js) - Google Analytics