ThinkPHP 一对多关联

这篇具有很好参考价值的文章主要介绍了ThinkPHP 一对多关联。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用一对多关联的前提

多的一方的数据库表有一的一方数据库表的外键。

举例,用户获取自己的所有文章

数据表结构如下

// 用户表
user
    user_id - integer  // 用户主键
    name - varchar // 用户名称



// 文章表
article
    article_id - integer // 文章主键
    title - varchar // 文章名标题
    content - text // 文章内容
    user_id - integer // 作者 user_id
 
 

 
 
 

多的一方(文章表)存在一的一方(用户表)的外键 user_id 。

一对多关联定义

用户表 user 模型:

<?php

namespace app\api\model;

class User extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'user_id';

    // 获取用户详情以及用户的所有文章
    public static function getDetail(int $user_id)
    {
        return self::get($user_id, 'articles');
    }

    // 一对多获取用户的文章
    public function articles()
    {
        // 完整写法
        return $this->hasMany('Article', 'user_id', 'user_id');
    }
}

hasMany 方法参数如下:

hasMany('关联模型', '关联模型外键', '当前模型主键');

除了关联模型外,其它参数都是可选。

  • 关联模型(必须):模型名或者模型类名
  • 关联模型外键:关联模型外键,默认的外键名规则是当前模型名+_id
  • 当前模型主键:当前模型主键,一般会自动获取也可以指定传入

实例演示

shop_article 表

ThinkPHP 一对多关联,数据库,php,ThinkPHP

 shop_user 表

ThinkPHP 一对多关联,数据库,php,ThinkPHP

演示1

获取 user_id 为 1 的用户详情以及用户的所有文章

用户 User 控制器

<?php

namespace app\api\controller;

use app\api\model\User as UserModel;

class User extends Base
{
    public function detail()
    {
        $user_id = 1;

        $detail = UserModel::getDetail($user_id);

        echo '<pre>';
        
        var_dump($detail);

        echo '</pre>';
    }
}

用户表 User 模型

<?php

namespace app\api\model;

class User extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'user_id';

    // 获取用户详情以及用户的所有文章
    public static function getDetail(int $user_id)
    {
        return self::get($user_id, 'articles');
    }

    // 一对多获取用户的文章
    public function articles()
    {
        // 完整写法
        return $this->hasMany('Article', 'user_id', 'user_id');
    }
}

user 控制器  detail 方法输出

object(app\api\model\User)#41 (2) {
  ["data"]=>
  array(4) {
    ["user_id"]=>
    int(1)
    ["name"]=>
    string(5) "admin"
    ["create_time"]=>
    int(1688452509)
    ["update_time"]=>
    int(1688452509)
  }
  ["relation"]=>
  array(1) {
    ["articles"]=>
    object(think\model\Collection)#50 (1) {
      ["items":protected]=>
      array(2) {
        [0]=>
        object(app\api\model\Article)#45 (2) {
          ["data"]=>
          array(6) {
            ["article_id"]=>
            int(1)
            ["title"]=>
            string(12) "测试标题"
            ["content"]=>
            string(12) "测试内容"
            ["user_id"]=>
            int(1)
            ["create_time"]=>
            int(1689401566)
            ["update_time"]=>
            int(1689401566)
          }
          ["relation"]=>
          array(0) {
          }
        }
        [1]=>
        object(app\api\model\Article)#46 (2) {
          ["data"]=>
          array(6) {
            ["article_id"]=>
            int(2)
            ["title"]=>
            string(13) "测试标题1"
            ["content"]=>
            string(13) "测试内容1"
            ["user_id"]=>
            int(1)
            ["create_time"]=>
            int(1689498967)
            ["update_time"]=>
            int(1689498967)
          }
          ["relation"]=>
          array(0) {
          }
        }
      }
    }
  }
}

单条查询输出的是 User 模型实例,User 模型实例的 relation 属性(关联数组)保存着关联模型,在该关联数组中,关联方法名 articles 作为键名,关联查询结果作为键值(对一关联查询返回模型实例,对多关联查询返回结果集对象)。

使用的 SQL 如下

SELECT * FROM `shop_user` WHERE `user_id` = 1 LIMIT 1

SELECT * FROM `shop_article` WHERE `user_id` = 1

获取当前用户的文章,访问 articles(关联方法名) 属性即可,如下

<?php

namespace app\api\controller;

use app\api\model\User as UserModel;

class User extends Base
{
    public function detail()
    {
        $user_id = 1;

        $detail = UserModel::getDetail($user_id);

        echo '<pre>';

        var_dump($detail->articles);

        echo '</pre>';
    }
}

输出如下

object(think\model\Collection)#50 (1) {
  ["items":protected]=>
  array(2) {
    [0]=>
    object(app\api\model\Article)#45 (2) {
      ["data"]=>
      array(6) {
        ["article_id"]=>
        int(1)
        ["title"]=>
        string(12) "测试标题"
        ["content"]=>
        string(12) "测试内容"
        ["user_id"]=>
        int(1)
        ["create_time"]=>
        int(1689401566)
        ["update_time"]=>
        int(1689401566)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [1]=>
    object(app\api\model\Article)#46 (2) {
      ["data"]=>
      array(6) {
        ["article_id"]=>
        int(2)
        ["title"]=>
        string(13) "测试标题1"
        ["content"]=>
        string(13) "测试内容1"
        ["user_id"]=>
        int(1)
        ["create_time"]=>
        int(1689498967)
        ["update_time"]=>
        int(1689498967)
      }
      ["relation"]=>
      array(0) {
      }
    }
  }
}

演示2

获取所有用户的用户详情以及用户的所有文章

用户 User 控制器

<?php

namespace app\api\controller;

use app\api\model\User as UserModel;

class User extends Base
{
    // 获取所有用户的用户详情以及用户的所有文章
    public function list()
    {
        $list = UserModel::getList();

        echo '<pre>';
        
        var_dump($list);

        echo '</pre>';

    }
}

用户表 User 模型

<?php

namespace app\api\model;

class User extends Base
{

    protected $pk = 'user_id';

    // 获取所有用户的用户详情以及用户的所有文章
    public static function getList()
    {
        return self::with('articles')->select();
    }

    // 一对多获取用户的文章
    public function articles()
    {
        // 完整写法
        return $this->hasMany('Article', 'user_id', 'user_id');
    }
}

user 控制器  list 方法输出

object(think\model\Collection)#44 (1) {
  ["items":protected]=>
  array(3) {
    [0]=>
    object(app\api\model\User)#41 (2) {
      ["data"]=>
      array(4) {
        ["user_id"]=>
        int(1)
        ["name"]=>
        string(5) "admin"
        ["create_time"]=>
        int(1688452509)
        ["update_time"]=>
        int(1688452509)
      }
      ["relation"]=>
      array(1) {
        ["articles"]=>
        object(think\model\Collection)#52 (1) {
          ["items":protected]=>
          array(2) {
            [0]=>
            object(app\api\model\Article)#47 (2) {
              ["data"]=>
              array(6) {
                ["article_id"]=>
                int(1)
                ["title"]=>
                string(12) "测试标题"
                ["content"]=>
                string(12) "测试内容"
                ["user_id"]=>
                int(1)
                ["create_time"]=>
                int(1689401566)
                ["update_time"]=>
                int(1689401566)
              }
              ["relation"]=>
              array(0) {
              }
            }
            [1]=>
            object(app\api\model\Article)#48 (2) {
              ["data"]=>
              array(6) {
                ["article_id"]=>
                int(2)
                ["title"]=>
                string(13) "测试标题1"
                ["content"]=>
                string(13) "测试内容1"
                ["user_id"]=>
                int(1)
                ["create_time"]=>
                int(1689498967)
                ["update_time"]=>
                int(1689498967)
              }
              ["relation"]=>
              array(0) {
              }
            }
          }
        }
      }
    }
    [1]=>
    object(app\api\model\User)#42 (2) {
      ["data"]=>
      array(4) {
        ["user_id"]=>
        int(2)
        ["name"]=>
        string(0) ""
        ["create_time"]=>
        int(1689732287)
        ["update_time"]=>
        int(1689732287)
      }
      ["relation"]=>
      array(1) {
        ["articles"]=>
        object(think\model\Collection)#53 (1) {
          ["items":protected]=>
          array(0) {
          }
        }
      }
    }
    [2]=>
    object(app\api\model\User)#43 (2) {
      ["data"]=>
      array(4) {
        ["user_id"]=>
        int(3)
        ["name"]=>
        string(6) "测试"
        ["create_time"]=>
        int(1690355199)
        ["update_time"]=>
        int(1690355199)
      }
      ["relation"]=>
      array(1) {
        ["articles"]=>
        object(think\model\Collection)#54 (1) {
          ["items":protected]=>
          array(0) {
          }
        }
      }
    }
  }
}

多条查询返回的是 Collection(结果集)对象,Collection 对象的 item 属性保存着所有用户模型实例,每个用户模型实例的 relation 属性 (关联数组)属性保存着关联模型实例,关联方法名 articles 作为键名,结果集对象作为键值,结果集对象的 items 属性(索引数组)保存着关联查询结果。

使用的 SQL 如下

SELECT * FROM `shop_user`

SELECT * FROM `shop_article` WHERE `user_id` IN (1,2,3)

获取每个用户的所有文章,访问 articles(关联方法名) 属性即可,如下

<?php

namespace app\api\controller;

use app\api\model\User as UserModel;

class User extends Base
{
    public function list()
    {
        $list = UserModel::getList();

        foreach ($list as $user) {
            
            echo '<pre>';

            var_dump($user->articles);

            echo '</pre>';
        }
    }

}

​​​​​​​

user 控制器 list 方法输出如下文章来源地址https://www.toymoban.com/news/detail-618421.html

object(think\model\Collection)#52 (1) {
  ["items":protected]=>
  array(2) {
    [0]=>
    object(app\api\model\Article)#47 (2) {
      ["data"]=>
      array(6) {
        ["article_id"]=>
        int(1)
        ["title"]=>
        string(12) "测试标题"
        ["content"]=>
        string(12) "测试内容"
        ["user_id"]=>
        int(1)
        ["create_time"]=>
        int(1689401566)
        ["update_time"]=>
        int(1689401566)
      }
      ["relation"]=>
      array(0) {
      }
    }
    [1]=>
    object(app\api\model\Article)#48 (2) {
      ["data"]=>
      array(6) {
        ["article_id"]=>
        int(2)
        ["title"]=>
        string(13) "测试标题1"
        ["content"]=>
        string(13) "测试内容1"
        ["user_id"]=>
        int(1)
        ["create_time"]=>
        int(1689498967)
        ["update_time"]=>
        int(1689498967)
      }
      ["relation"]=>
      array(0) {
      }
    }
  }
}
object(think\model\Collection)#53 (1) {
  ["items":protected]=>
  array(0) {
  }
}
object(think\model\Collection)#54 (1) {
  ["items":protected]=>
  array(0) {
  }
}

如果觉得作者写得好,请帮我点个赞,谢谢。

到了这里,关于ThinkPHP 一对多关联的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • thinkphp学习06-连接数据库与模型初探

    插入数据 修改.env数据库配置 测试环境下是可以使用的,但是到了线上建议配置到config下database.php 可以通过删除改变.env 的配置,或删除.env 来验证 database 的执行优先级,经过验证可知:.envdatabase.php 新建DataTest.php connections 配置数据库连接信息,可以是多个数据库,便于切换,

    2024年01月16日
    浏览(37)
  • thinkphp6 入门(4)--数据库操作 增删改查

    一、设计数据库表 比如我新建了一个数据库表,名为test 二、配置数据库连接信息  本地测试 直接在.env中修改,不用去config/database.php中修改 正式环境 三、增删改查  引入Db库 假设新增的控制器路径为 apptestcontrollerCURD.php 2. 增 Db::name(\\\'test\\\')其中\\\'test\\\'为数据库表的名字,使用

    2024年02月09日
    浏览(41)
  • thinkphp5框架的model支持多地区数据库切换

    一般情况下,都是在model中指定一个数据库连接参数即可。但某些情况下,相同的库表会在不同地区都有部署,这个时候需要按地区进行切换(只有一个model情况下)。 Model层代码 使用A地区的数据库: $model = new A(); 使用B地区的数据库: $model = new B(); 需要更改地方:config.ph

    2024年02月12日
    浏览(37)
  • 通过一个实际例子说明Django中的数据库操作方法OneToOneField()的用法【数据表“一对一”关系】

    当我们在Django中定义一个模型时,可以使用 OneToOneField 来建立一个一对一的关系。这种关系表示两个模型之间的一种特殊关联,其中一个模型的实例只能与另一个模型的实例关联。 让我们以一个简单的示例来说明 OneToOneField 的用法。假设我们正在构建一个简单的博客应用,其

    2024年02月13日
    浏览(57)
  • 通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】

    当使用Django进行数据库操作时,ForeignKey(外键)是一种非常有用的字段类型。它允许在数据库表之间创建关联关系,类似于其他数据库系统中的外键概念。通过ForeignKey字段,我们可以建立一个模型与另一个模型的一对多关系。 以下是一个实际例子,使用ForeignKey字段在Djang

    2024年02月12日
    浏览(55)
  • 关于两个不同数据库的两张表建立数据库链接,关联查询数据

    数据库链接(database link)是用于跨不同数据库之间进行连接和数据传输的工具或方法。它允许在一个数据库中访问另一个数据库中的对象和数据。 --1.建立链接tjpt 上述示例中的  pt_user 、 pt_password  和  10.70.231.130/orcl 需要替换为实际的用户、密码和数据库信息。 创建链接后

    2024年02月10日
    浏览(51)
  • 【Oracle数据库】两个表关联更新

    根据执行结果可以看到a1表里面有的而b1表里面没有的直接更新为null 原因 在更新的时候没有加更新的范围 更新增加了更新的条件,那就是a1和b1都有相同的id那么就有select 1,那么exists就会返回true;最后进行更新操作 exists的作用是检查子查询的结果是否为真,如果子查询为

    2024年02月16日
    浏览(48)
  • thinkphp:数据库查询,嵌套别的表的查询(别的表做子查询)

    从  vendors  表中选择记录。 在  vendors  表中,筛选出具有满足以下条件的  vendor_code  值: 对应的采购订单(在  po_headers_all  表中)存在未完全接收的采购行(在  po_lines_all  表中)。 相应的采购订单状态为 \\\"已签核\\\"。 采购行的数量大于已接收数量。 查询结果按照  v

    2024年02月10日
    浏览(38)
  • Django关联已有数据库中已有的数据表

    兜兜转转,发现自己还得用Python写后端,无语。。。 在写Django项目时,一般是通过模型来创建表,以及通过ORM框架来实现数据的crud,现在的情况是,如果我们的数据表已经存在了,如何引入到Django的项目中,方便我们实现ORM操作呢,记录一下可行的方案 如:我想连接我MyS

    2024年01月19日
    浏览(48)
  • 数据库 关联两个表查询 出现最后的名字拼接

    先找到相同的case_id 再找一张表下 相同case_id 的名字的代号 再找另外一张表的  代号   在找代号下的名字信息 再进行拼接

    2024年01月25日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包