ThinkPHP5中模型的一對(duì)一關(guān)聯(lián)關(guān)系

現(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í)就是從表。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容