現(xiàn)在有兩張表:
-- ----------------------------
-- 商品表
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(80) NOT NULL COMMENT '商品名稱(chēng)',
`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='圖片總表';
商品表中有一個(gè) img_id 字段作為圖片的外鍵。
一個(gè)商品有一張圖片,一張圖片對(duì)應(yīng)一個(gè)商品。所以商品表和圖片表是一對(duì)一的關(guān)系。
所以,商品表是主表,圖片表是從表。
那么在 TP5 中要定義模型的一對(duì)一關(guān)系的話,應(yīng)該使用如下兩種方法
- belongsTo
- hasOne
那么這兩種方法要怎么使用呢?文檔是這么寫(xiě)的
- hasOne('關(guān)聯(lián)模型名','外鍵名','主鍵名',['模型別名定義'],'join類(lèi)型');
- belongsTo('關(guān)聯(lián)模型名','外鍵名','關(guān)聯(lián)表主鍵名',['模型別名定義'],'join類(lèi)型');
所以,只需要知道外鍵在哪一張表即可知道用哪一個(gè)方法。
這個(gè)例子中,Product 中有 Image 的外鍵 img_id,所以在 Product 模型中這么定義
class Product extends Model
{
public function img()
{
// 要關(guān)聯(lián)的模型 外鍵 另外一張表的主鍵
$this->belongsTo('Image', 'img_id', 'id');
}
}
如果這個(gè)例子改成
-- ----------------------------
-- 商品表
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(80) NOT NULL COMMENT '商品名稱(chēng)',
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='圖片總表';
現(xiàn)在是圖片表有商品的外鍵,那么關(guān)聯(lián)關(guān)系這么定義
class Product extends Model
{
public function img()
{
// 要關(guān)聯(lián)的模型 另外一張表的外鍵 我自己的主鍵
$this->hasOne('Image', 'product_id', 'id');
}
}
總結(jié)
雖然是一對(duì)一關(guān)系,但是兩者是由主從關(guān)系的。誰(shuí)持有外鍵,誰(shuí)就是從,另外一個(gè)就是主。
belongsTo 和 hasOne 從字面上來(lái)看是
- belongsTo A 屬于 B
- hasOne A 有一個(gè) B
所以,商品有圖片的外鍵 img_id,那么商品就是從表,圖片就是主表。因此可以得到
- 商品 belongsTo 圖片
- 圖片 hasOne 商品
反正就是,誰(shuí)有外鍵,誰(shuí)就是從表。