ThinkPHP

ThinkPHP5中模型的一对一关联关系

2018-04-30  本文已影响687人  红烧排骨饭

现在有两张表:

-- ----------------------------
-- 商品表
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(80) NOT NULL COMMENT '商品名称',
  `img_id` int(11) DEFAULT NULL COMMENT '图片外键',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- 图片表
-- ----------------------------
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL COMMENT '图片路径'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图片总表';

商品表中有一个 img_id 字段作为图片的外键。

一个商品有一张图片,一张图片对应一个商品。所以商品表和图片表是一对一的关系。
所以,商品表是主表,图片表是从表。

那么在 TP5 中要定义模型的一对一关系的话,应该使用如下两种方法

那么这两种方法要怎么使用呢?文档是这么写的

所以,只需要知道外键在哪一张表即可知道用哪一个方法。

这个例子中,Product 中有 Image 的外键 img_id,所以在 Product 模型中这么定义

class Product extends Model
{
    public function img()
    {
        // 要关联的模型  外键 另外一张表的主键
        $this->belongsTo('Image', 'img_id', 'id');
    }
}

如果这个例子改成

-- ----------------------------
-- 商品表
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(80) NOT NULL COMMENT '商品名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- 图片表
-- ----------------------------
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL COMMENT '图片路径',
  `product_id` int(11) NOT NULL COMMENT '商品外键',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图片总表';

现在是图片表有商品的外键,那么关联关系这么定义

class Product extends Model
{
    public function img()
    {       
        // 要关联的模型  另外一张表的外键  我自己的主键
        $this->hasOne('Image', 'product_id', 'id');
    }
}

总结

虽然是一对一关系,但是两者是由主从关系的。谁持有外键,谁就是从,另外一个就是主。

belongsTo 和 hasOne 从字面上来看是

所以,商品有图片的外键 img_id,那么商品就是从表,图片就是主表。因此可以得到

反正就是,谁有外键,谁就是从表

参考

上一篇下一篇

猜你喜欢

热点阅读