1. 程式人生 > >關聯模型的使用-thinkphp

關聯模型的使用-thinkphp

下面我們以一個例項來講述關聯操作的簡單用法,由於關聯操作定義複雜,這裡只是講述一般的情況。我們以使用者表為核心,來描述如何使用表的關聯操作。假設存在如下的關聯情況:

每個使用者有一個檔案表是HAS_ONE關聯;
每個使用者屬於一個部門是BELONGS_TO關聯;
每個使用者有多張銀行卡是HAS_MANY關聯;
每個使用者可能屬於多個專案組,每個專案組也有多個使用者是MANY_TO_MANY關聯。

我們首先來建立資料表,以MySQL為例:

// 部門表

CREATE TABLE `think_dept` (
`id` smallint(3) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

// 使用者表

CREATE TABLE `think_user` (
`id` mediumint(6) NOT NULL auto_increment,
`name` varchar(25) NOT NULL,
`dept_id` smallint(3) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8  ;

// 使用者檔案表

CREATE TABLE `think_profile` (
`id` mediumint(6) NOT NULL auto_increment,
`user_id` mediumint(6) NOT NULL,
`email` varchar(255) NOT NULL,
`nickname` varchar(50) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8  ;

// 銀行卡表

CREATE TABLE `think_card` (
`id` mediumint(6) NOT NULL auto_increment,
`user_id` mediumint(6) NOT NULL,
`card` varchar(25) character set latin1 NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8  ;

// 專案組表

CREATE TABLE  `think_group` (
`id` mediumint(6) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;


// 使用者-專案組

CREATE TABLE  `think_group` (
`id` mediumint(6) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

CREATE TABLE `think_user_group` (
`id` mediumint(6) NOT NULL auto_increment,
`group_id` mediumint(5) NOT NULL,
`user_id` mediumint(5) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


下面我們分別來給資料表定義對應的模型,這裡關鍵是使用者模型的定義,因為我們以使用者表為核心來定義和使用關聯,所以其他模型中無需再定義關聯關係。

class UserModel extends Model
{
protected $_link = array(
‘Profile’=>HAS_ONE,
‘Dept’=>BELONGS_TO,
‘Card’=>HAS_MANY,
‘Group’=>MANY_TO_MANY,
);
}


上面的關聯定義,我們採用了最簡潔的定義方式,也就是所有規則都按照系統的預設規則進行。這些規則包括主鍵、外來鍵、表名的規範。完整的關聯定義可以寫成:

class UserModel extends Model
{
protected $_link = array(
‘Profile’=>array(
‘mapping_type’=>HAS_ONE,
‘mapping_name’=>’Profile’,
‘class_name’=>’Profile’,
‘foreign_key’=>’user_id’,
),
‘Dept’=> array(
‘mapping_type’=> BELONGS_TO,
‘mapping_name’=>’Dept’,
‘class_name’=>’Dept’,
‘foreign_key’=>’dept_id’,
),
‘Card’=> array(
‘mapping_type’=> HAS_MANY,
‘mapping_name’=>’Card’,
‘class_name’=>’Card’,
‘foreign_key’=>’user_id’,
),
‘Group’=> array(
‘mapping_type’=> MANY_TO_MANY,
‘mapping_name’=>’Group’,
‘class_name’=>’Group’,
‘foreign_key’=>’user_id’,
‘relation_foreign_key’=>’group_id’,
‘relation_table’=>’think_user_group’,
),
);
}


如果要給關聯定義增加可選的屬性,則必須採用完整定義的方式。

其中Profile Dept Card Group 分別是其他幾個模型的名稱,定義如下:

class ProfileModel extends Model {}

class DeptModel extends Model {}

class CardModel extends Model {}

class GroupModel extends Model {}

因為我們以使用者表為核心來讀取關聯,所以使用者和專案組的中間表 預設的規則必須是 user_group

也就是我們上面建立的think_user_group表,如果你的中間表的名稱不是這個規則,需要定義relation_table屬性。

為了演示的方便,我們首先給部門表和專案組表增加一些資料:

INSERT INTO `think_dept` (`id`, `name`) VALUES (1, ‘開發部’),(2, ‘銷售部’) ,(3, ‘財務部’);

INSERT INTO `think_group` (`id`, `name`) VALUES (1, ‘專案組1′),(2, ‘專案組2′) ,(3, ‘專案組3′);

接下來首先演示關聯寫入,我們建立一個IndexAction用於演示操作,記得在專案配置檔案裡面定義好資料庫的連線資訊。

在IndexAction的index操作方法裡面新增

$User = D(”User”);
$User->name =  ‘thinkphp’;
$User->dept_id   =  1;
$User->Profile =  array(
‘email’            =>’[email protected]’,
‘nickname’     =>’流年’,
);
$User->Card   =  array(
array(‘id’=>1.’card’=>’12345678′),
array(‘id’=>2,’card’=>’88888888′),
);
$User->Group =  array(
array(’id’=>1),
array(’id’=>2),
);
$User->add(”,true);


在執行User模型的add方法的同時,我們已經寫入了think_profile、think_card和think_user_group三個表的資料,BELONGS_TO關聯關係是不會自動寫入的。

如果我們在模型裡面設定了autoAddRelations屬性為True的話,使用

$User->add();

方法即可同時進行關聯寫入。

為了驗證關聯資料是否已經寫入,我們現在來使用關聯查詢把相關的資料查出來。

$user   =  $User->relation(true)->find(1);

Dump($user);

可以看到輸出的結果,把User模型關聯的資料都顯示出來了。如果我們只希望獲取某個關聯資料,可以使用

$user   =  $User->relation(‘Profile’)->find(1);

表示只是獲取關聯的使用者檔案資料。

資料集的查詢也可以支援關聯查詢,使用

$user   =  $User->relation(true)->findAll();

能夠顯示出完整的含有關聯資料的資料集。

我們再來更新關聯資料

$user[‘id’]      =     1;
$user['name'] = ‘tp’;
$user['Profile']['email'] =  ‘[email protected]’;
$user['Card']  =     array(
array(’id’=>1,’card’=>’66666666′),
array(’id’=>2,’card’=>’77777777′),
);
$user[‘Group’] =  array(
array(’id’=>1),
array(’id’=>3),
);
$User->save($user,’id=1′,true);

注意關聯更新的時候一定要包含主鍵資料。

關聯刪除

$User->deleteById(2,true);

相關推薦

thinkphp 3.2中依靠關聯模型關聯三個表

需要 用戶 9.png mod 做到 圖模型 查詢 think image 這裏說的是用thinkphp3.2關聯模型關聯三個表 根據用戶表查詢出三個表的數據,需要兩個model來配合,第一個model是根據user表來查詢到班級的信息,然後第二個model是根絕banj

ThinkPHP中坑爹的關聯模型

ThinkPHP中的關聯模型極大的方便了我們的資料處理,但是一不留神就會掉進它的坑裡,今天下午有個同事就不幸中招了,這位同事本來想通過關聯模型來查詢資料,一個非常簡單的需求,但查詢出來的資料死活都是

關聯模型的使用-thinkphp

下面我們以一個例項來講述關聯操作的簡單用法,由於關聯操作定義複雜,這裡只是講述一般的情況。我們以使用者表為核心,來描述如何使用表的關聯操作。假設存在如下的關聯情況: 每個使用者有一個檔案表是HAS_ONE關聯; 每個使用者屬於一個部門是BELONGS_TO關聯; 每個使用者有多張銀行卡是HAS_MANY關聯

TP5中關聯模型的使用詳解

php 關聯模型 tp5 首先是model裏,舉個例子,user.php<?phpnamespace app\rbac\model;use think\Model;class User extends Model{ public function roleusers() {

Laravel5.1 關聯模型之後操作

func des associate 追加 接受 laravel 自動 批量 調用 h2 { color: #A0522D } h3 { color: #FF6347 } p { color: #6B6B6B } span.tag { color: #FF0066 } sp

關聯模型(1:n)

time mes 解決 可能 spa 關聯 tle 模式 this 關聯模型 (1對n) ThinkPHP5.0 的關聯采用了對象化的操作模式,你無需繼承不同的模型類 只是把關聯定義成一個方法,並且直接通過當前模型對象的屬性名獲取定義的關聯數據。 關聯定義:一個user

關聯模型 (1對1)

gpo 才會 默認 別名 reat join ech sts mod 關聯模型 (1對1) ThinkPHP5.0 的關聯采用了對象化的操作模式,你無需繼承不同的模型類 只是把關聯定義成一個方法,並且直接通過當前模型對象的屬性名獲取定義的關聯數據。 關聯定義:一個use

laravel中關聯模型查詢選擇性的字段

基類 per asp function 自己 ext 實現 arr scope 在使用 Laravel 的關聯查詢中,我們經常使用 with 方法來避免 1+N 查詢,但是 with 會將目標關聯的所有字段全部查詢出來,對於有強迫癥的PHPer來說,當然是不允許發生的。

<記錄>TP5 關聯模型使用

elong isp sele aso comm 商品 數據庫設計 left list 在數據庫設計中,常常會有如下這種關聯模型,分類表中一條分類對應多個商品表中的商品 如果要獲得分類表中每條分類 以及 對應的商品的信息,則需要先查詢分類表中的數據,然後根據結果遍歷查詢商品

TP的關聯模型查詢筆記(備忘)

//進行關聯定義belongsTo設定(一對一關係) public function img(){ //關聯模型名,外來鍵名,當前模型主鍵名 return $this->belongsTo("ImageModel","img_id","id"); }   //

例項講解TP5中關聯模型

https://blog.csdn.net/github_37512301/article/details/75675054 一、關聯模型在關係型資料庫中,表之間有一對一、一對多、多對多的關係。在 TP5 中,實現了ORM (Object Relational Mapping) 的思想,通過在模型

TP5 關聯模型使用(巢狀關聯、動態排序以及隱藏欄位)

在資料庫設計中,常常會有如下這種關聯模型,分類表中一條分類對應多個商品表中的商品 如果要獲得分類表中每條分類 以及 對應的商品的資訊,則需要先查詢分類表中的資料,然後根據結果遍歷查詢商品表,最後把資料拼接在一起 TP5中關聯模型可以解決這一問題 普通關聯 先建立分類表模型 Category.php

064:ORM查詢條件詳解-in和關聯模型查詢

ORM查詢條件詳解-in和關聯模型查詢: in:提取那些給定的 field 的值是否在給定的容器中。容器可以為 list 、 tuple 或者任何一個可以迭代的物件,包括 QuerySet 物件。示例程式碼如下: result = Article.objects.filter(id__in=[1,4

Thinkphp3.2.3 解決關聯模型的自動生成問題($_auto)

在Thinkphp中,關聯模型經常會被使用到,然而最近在使用的時候發現關聯模型中的自動生成功能有些問題。 例如有一個類IdeaDetailModel對應表oidea_idea_detail,它有一個簡表oidea_idea_simple(類IdeaSimple

ThinkPHP5.0框架下多對多關聯模型的增刪改查

現在有三個表 管理員表my_admin 角色表my_role 中間表my_admin_role SET FOREIGN_KEY_CHECKS=0; SET NAMES 'utf8'; -- ---------------------------- -- Tabl

PHP TP5 省市區表多級關聯模型查詢,和db方式查詢封裝效率

      需要對省市區 三張表進行查詢,將查詢結果 進行組裝成如下格式,便於前段js呼叫 array (size=34) 1 => array (size=4) 'id' => int 1 'name' => st

mybatis 多表查詢,關聯模型

資料庫的表存在多表的關聯關係。 用的是mysql5.5,ssm框架搭建一個管理系統 我用mybatis-generator生成的pojo和mapper.xml以及mapper等檔案,不會自動幫我建立

對於tp5.0關聯模型的幾點注意事項

1.belongsTo()、hasOne()的區別 在定義一對一關聯模模型方法時,對其有疑惑不知道該定義哪個: belongsTo是定義在關聯模型從模型中,也是從模型對應的表一般都儲存外來鍵id,在關聯模型屬於從屬關係 hasOne   是定義在主模型中,在關聯模型中屬

tp5.0筆記5:關聯模型

前面筆記3說,資料庫操作分為三個層次,前兩個層次已經在筆記3進行彙總了,現將第三個層次進行了彙總如下場景1:現有一個使用者表,和一個書籍表,使用者與書籍的關係是一對多,那麼我們就可以利用tp5.0的提供的關聯模型,內容如下<?php namespace app\inde

Thinkphp5關聯模型的定義與使用

定義一對一關聯 這裡假設你已經把thinkphp5的環境都配置好了,資料庫也連線OK了。想通過模型把兩張表關聯起來然後在通過控制器一呼叫就可以得到兩張表的資訊。 現在我準備了兩張表,一張管理員表pwn_admin一張管理員資訊表pwn_admin_messa