现在有两张表:
-- ----------------------------
-- 商品表
-- ----------------------------
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 中要定义模型的一对一关系的话,应该使用如下两种方法
- belongsTo
- hasOne
那么这两种方法要怎么使用呢?文档是这么写的
- hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');
- belongsTo('关联模型名','外键名','关联表主键名',['模型别名定义'],'join类型');
所以,只需要知道外键在哪一张表即可知道用哪一个方法。
这个例子中,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 从字面上来看是
- belongsTo A 属于 B
- hasOne A 有一个 B
所以,商品有图片的外键 img_id
,那么商品就是从表,图片就是主表。因此可以得到
- 商品 belongsTo 图片
- 图片 hasOne 商品
反正就是,谁有外键,谁就是从表。