定義從屬關(guān)聯(lián)
1、外鍵放置在主表中;
2、保存時(shí)不會(huì)自動(dòng)更新關(guān)聯(lián)表的記錄;
3、刪除時(shí)也不會(huì)更新關(guān)聯(lián)表的記錄。
示例:
多個(gè)文章都屬于某一個(gè)欄目。
格式一:
* class Articles
* {
* var $belongsTo = array(
* array(
* ’tableClass’ => ‘Columns’,
* ’foreignKey’ => ‘column_id’,
* ’mappingName’ => ‘column’
* ),
* );
* }
在上面的格式中,foreignKey 表示在當(dāng)前表中用什么字段存儲(chǔ)對(duì)關(guān)聯(lián)表的主鍵引用。
mappingName 表示在主表的返回結(jié)果中,以什么名字保存關(guān)聯(lián)表的數(shù)據(jù)。
如果不提供 mappingName 參數(shù),則假定使用 tableClass。
格式二:
* class Articles
* {
* var $belongsTo = ‘Columns’;
* }
格式二是一種簡(jiǎn)化寫法。foreignKey 字段名將和關(guān)聯(lián)表的主鍵字段名相同。
============================
$hasMany
定義一對(duì)多關(guān)聯(lián)
1、外鍵保存在關(guān)聯(lián)表中;
2、保存時(shí)自動(dòng)更新關(guān)聯(lián)表的記錄;
3、刪除主表記錄時(shí)自動(dòng)刪除關(guān)聯(lián)記錄。
示例:
每個(gè)用戶(user)有多張訂單 order。
格式一:
* class Users
* {
* var $hasMany = array(
* array(
* ’tableClass’ => ‘Orders’,
* ’foreignKey’ => ‘user_id’,
* ’mappingName’ => ‘orders’,
* ),
* );
* }
在一對(duì)多關(guān)系中,當(dāng)前表并不包含對(duì)關(guān)聯(lián)表的主鍵引用。
而是在關(guān)聯(lián)表中保存對(duì)當(dāng)前表的主鍵引用。
在上面的格式中,foreignKey 指示在關(guān)聯(lián)表中用什么字段存儲(chǔ)對(duì)當(dāng)前表的主鍵引用。
mappingName 表示在主表的返回結(jié)果中,以什么名字保存關(guān)聯(lián)表的數(shù)據(jù)。
如果不提供 mappingName 參數(shù),則假定使用 tableClass。
格式二:
* class Users
* {
* var $hasMany = ‘Orders’;
* }
簡(jiǎn)化寫法中,foreignKey 字段名將和當(dāng)前表的主鍵字段名相同。
============================
$hasOne
定義一對(duì)一關(guān)聯(lián)
1、外鍵放置在關(guān)聯(lián)表中;
2、保存時(shí)如果有關(guān)聯(lián)對(duì)象,則自動(dòng)創(chuàng)建或更新關(guān)聯(lián)表的記錄;
3、刪除主表記錄時(shí)自動(dòng)刪除關(guān)聯(lián)記錄。
示例:
當(dāng)前表為 users,用于存儲(chǔ)用戶賬戶。而每個(gè)用戶賬戶有且只有一個(gè)對(duì)應(yīng)的個(gè)人信息(profile)記錄。
格式一:
* class Users
* {
* var $hasOne = array(
* array(
* ’tableClass’ => ‘Profiles’,
* ’foreignKey’ => ‘profile_id’,
* ’mappingName’ => ‘profile’,
* ),
* );
* }
在上面的格式中,foreignKey 表示在關(guān)聯(lián)表中用什么字段存儲(chǔ)對(duì)主表的主鍵引用。 mappingName 表示在主表的返回結(jié)果中,以什么名字保存關(guān)聯(lián)表的數(shù)據(jù)。 如果不提供 mappingName 參數(shù),則假定使用 tableClass。
格式二:
* class Users
* {
* var $hasOne = ‘Profiles’;
* }
格式二是一種簡(jiǎn)化寫法。foreignKey 字段名將和主表的主鍵字段名名相同。
============================
$manyToMany
定義多對(duì)多關(guān)聯(lián)
1、外鍵保存在中間表里面;
2、保存時(shí)自動(dòng)更新中間表;
3、刪除主表記錄時(shí)自動(dòng)刪除中間表的相關(guān)記錄。
示例:
每個(gè)成員(member)可以擁有多個(gè)角色(role),而每個(gè)角色也可以指定給多個(gè)成員。
格式一:
* class Members
* {
* var $manyToMany = array(
* array(
* ’tableClass’ => ‘Roles’,
* ’joinTable’ => ‘member_roles’,
* ’foreignKey’ => ‘member_id’,
* ’assocforeignKey’ => ‘role_id’,
* ’mappingName’ => ‘roles’,
* ),
* );
* }
在多對(duì)多關(guān)系中,當(dāng)前表并不包含對(duì)關(guān)聯(lián)表的主鍵引用。
而是在一個(gè)中間表里面保存對(duì)當(dāng)前表和關(guān)聯(lián)表的主鍵引用。
在上面的格式中,joinTable 表示中間表的名字。foreignKey 和
assocforeignKey 分別表示在中間表里面用什么字段存儲(chǔ)對(duì)主表和
關(guān)聯(lián)表主鍵字段的引用。
mappingName 表示在主表的返回結(jié)果中,以什么名字保存關(guān)聯(lián)表的數(shù)據(jù)。
如果不提供 mappingName 參數(shù),則假定使用 tableClass。
格式二:
* class Members
* {
* var $manyToMany = ‘Roles’;
* }
簡(jiǎn)化寫法中,foreignKey 字段名將和當(dāng)前表的主鍵字段名相同。
assocforeignKey字段名稱則和關(guān)聯(lián)數(shù)據(jù)表的主鍵字段名相同。
而中間表名稱將用FLEA_Db_TableDataGateway::getMidtableName() 方法計(jì)算。
hasOne 是一對(duì)多關(guān)聯(lián),表示一條主表記錄有一條對(duì)應(yīng)的關(guān)聯(lián)記錄。
而 belongsTo 是從屬關(guān)聯(lián),表示一條主表記錄屬于另一條關(guān)聯(lián)記錄。
hasOne 和 belongsTo 正好是相反的關(guān)系。
例如 “一個(gè)用戶”有一個(gè)“個(gè)人空間”。那么一個(gè)“個(gè)人空間”就屬于“一個(gè)用戶”。
由于 hasOne 實(shí)際上是 hasMany (一對(duì)多)關(guān)聯(lián)的一種特例,所以 belongsTo 和 hasMany 也是相反的關(guān)系。
]]>HAS_ONE: 當(dāng)前表的每一條記錄都擁有最多一條(0–1)關(guān)聯(lián)記錄
HAS_MANY: 當(dāng)前表的每一條記錄都擁有多條(0-n)關(guān)聯(lián)記錄
MANY_TO_MANY: 當(dāng)前表的每一條記錄都和其他表的多條(0-n)記錄關(guān)聯(lián)
BELONGS_TO: 當(dāng)前表的每一條記錄都屬于另一個(gè)表的某條記錄
關(guān)聯(lián)中必須設(shè)置的屬性為:
‘name’, // 關(guān)聯(lián)的名字(如:hasOne、hasMany)
‘tableClass’, // 關(guān)聯(lián)的表數(shù)據(jù)入口對(duì)象名
‘mappingName’, // 字段映射名
可選屬性:
‘foreignKey’, //外鍵字段名
’sort’, //對(duì)關(guān)聯(lián)表進(jìn)行查詢時(shí)使用的排序參數(shù)
‘conditions’, //對(duì)關(guān)聯(lián)表進(jìn)行查詢時(shí)使用的條件參數(shù)
‘fields’, //對(duì)關(guān)聯(lián)表進(jìn)行查詢時(shí)要獲取的關(guān)聯(lián)表字段
‘limit’, //對(duì)關(guān)聯(lián)表進(jìn)行查詢時(shí)限制查出的記錄數(shù)
‘enabled’, //是否處理關(guān)聯(lián),設(shè)置為falses時(shí),不處理該表入口的任何關(guān)聯(lián)。enabled 的優(yōu)先級(jí)高于 linkRead、linkCreate、linkUpdate 和 linkRemove。
‘countOnly’, //指示在查詢關(guān)聯(lián)表時(shí)是否僅僅統(tǒng)計(jì)記錄數(shù),而不實(shí)際查詢數(shù)據(jù)
‘counterCache’, //將關(guān)聯(lián)記錄總數(shù)緩存到指定的字段,數(shù)據(jù)表中要建立相應(yīng)的字段
‘linkRead’, //指示是否在主表讀取記錄時(shí)也讀取該關(guān)聯(lián)對(duì)應(yīng)的關(guān)聯(lián)表的記錄,默認(rèn)ture
‘linkCreate’, //指示是否在主表創(chuàng)建記錄時(shí)也創(chuàng)建該關(guān)聯(lián)對(duì)應(yīng)的關(guān)聯(lián)表的記錄,默認(rèn)ture
‘linkUpdate’, //指示是否在主表更新記錄時(shí)也更新該關(guān)聯(lián)對(duì)應(yīng)的關(guān)聯(lián)表的記錄,默認(rèn)ture
‘linkRemove’, //指示是否在主表刪除記錄時(shí)也刪除該關(guān)聯(lián)對(duì)應(yīng)的關(guān)聯(lián)表的記錄,默認(rèn)ture
‘linkRemoveFillValue’, //當(dāng)刪除主表記錄而不刪除關(guān)聯(lián)表記錄時(shí),用什么值填充關(guān)聯(lián)表記錄的外鍵字段,默認(rèn)0
’saveAssocMethod’, //指示當(dāng)保存關(guān)聯(lián)數(shù)據(jù)時(shí),采用何種方法,默認(rèn)為 save,可以設(shè)置為 create、update 或 replacevar $belongsTo = array(
‘tableClass’ => ‘Table_Users’,
‘mappingName’ => ‘a(chǎn)uthor’,
‘foreignKey’ => ‘user_id’
);
var $hasOne = array(
‘tableClass’ => ‘Table_Profiles’,
‘mappingName’ => ‘profiles’,
‘foreignKey’ => ‘user_id’,
’saveAssocMethod’=> ’save’
);
var $hasMany = array(
‘tableClass’ => ‘Table_Profiles’,
‘mappingName’ => ‘profiles’,
‘foreignKey’ => ‘user_id’,
’saveAssocMethod’=> ’save’
);
var $manyToMany=array(
);
一個(gè)表可以有多個(gè)關(guān)聯(lián)
var $hasMany = array(
array(
‘tableClass’ => ‘Model_Permissions’,
‘foreignKey’ => ‘pclass_id’,
‘mappingName’ => ‘permissions’,
),
array(
‘tableClass’ => ‘Model_Products’,
‘foreignKey’ => ‘pclass_id’,
‘mappingName’ => ‘products’,
‘enabled’ => false,
),
[
array(
...
),
]
);
關(guān)聯(lián): 一個(gè)關(guān)聯(lián)是一個(gè)關(guān)系,這個(gè)關(guān)系屬于某一個(gè)數(shù)據(jù)表。例如 users 表可能就擁有一個(gè)或者多個(gè)關(guān)聯(lián)。
主表: 對(duì)于一個(gè)關(guān)聯(lián),擁有該關(guān)聯(lián)的數(shù)據(jù)表就是主表。例如 posts 表定義了一個(gè) MANY_TO_MANY 關(guān)聯(lián)。
那么在這里(指這個(gè)關(guān)聯(lián)),posts 就是主表。
關(guān)聯(lián)表: 在一個(gè)關(guān)聯(lián)中,關(guān)聯(lián)表就是除主表外的另一個(gè)表。
外鍵: 在數(shù)據(jù)庫(kù)原理中,外鍵的含義很復(fù)雜。但在 FleaPHP 框架中的數(shù)據(jù)庫(kù)關(guān)聯(lián)功能中,
外鍵泛指一個(gè)記錄中用于關(guān)聯(lián)另一個(gè)記錄的字段。例如 profile 表中的 user_id 字段就是用于關(guān)聯(lián) users 表的字段。
這個(gè) user_id 字段就是一個(gè)外鍵。
中間表: 在 MANY_TO_MANY 關(guān)聯(lián)中,除了主表和關(guān)聯(lián)表,還需要另一個(gè)表來(lái)保存這兩個(gè)表的記錄之間的互相關(guān)聯(lián)關(guān)系。
這個(gè)表稱為中間表。
HAS_ONE 一對(duì)一關(guān)聯(lián)
HAS_ONE 是一種非常簡(jiǎn)單的關(guān)聯(lián)關(guān)系。表示一個(gè)記錄擁有另一個(gè)記錄。這兩個(gè)記錄分別位于兩個(gè)數(shù)據(jù)表中。
示例
在一個(gè)信息管理系統(tǒng)中,users 表用于存儲(chǔ)用戶帳戶的基本信息,例如用戶名、密碼等。
而 profiles 表則用于存儲(chǔ)用戶的個(gè)人信息,例如家庭住址、郵政編碼等。
由于每一個(gè)用戶(一條 users 表中的記錄)都有一份對(duì)應(yīng)的個(gè)人信息(一條 profiles 表中的記錄)。
因此,我們就可以為 users 表定義一個(gè) HAS_ONE 關(guān)聯(lián)。
很明顯,users 表的記錄擁有一條 profiles 表的記錄。因此,當(dāng) users 表中的一條記錄被刪除時(shí),
被刪除記錄所擁有的 profiles 表中的關(guān)聯(lián)記錄也會(huì)被自動(dòng)刪除。
表定義
在 HAS_ONE 關(guān)聯(lián)中,要求外鍵放置在關(guān)聯(lián)表中
分別對(duì)應(yīng)FLEA_Db_TableDataGateway表中的 $hasOne,$hasMany,$manyToMany,$belongsTo 屬性
我們下面就用 老師,學(xué)生,學(xué)生檔案,班級(jí)的例子說(shuō)說(shuō)這幾個(gè)關(guān)系。
以下是SQL代碼:
//教師表
Create TABLE `testDB`.`teacher` (
`teacher_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`teacher_name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`teacher_id`)
)
//班級(jí)表
Create TABLE `testDB`.`classes` (
`class_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`class_name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`class_id`)
)
//由于教師與班級(jí)是多對(duì)多關(guān)系,所有建立一個(gè)中間連接表以表示該關(guān)聯(lián)
Create TABLE `testDB`.`link_teacher_classes` (
`link_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`teacher_id` INTEGER UNSIGNED NOT NULL,
`class_id` INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (`link_id`)
)
現(xiàn)在,建好表之后,我們還要寫幾個(gè)繼承自FLEA_Db_TableDataGateway父類的類,以對(duì)應(yīng)數(shù)據(jù)庫(kù)中的Student,Teacher,Classes表(連接表不用了)如下:
/*
這是一對(duì)一關(guān)系,一個(gè)學(xué)生對(duì)應(yīng)唯一的一個(gè)Record檔案
tableClass 對(duì)應(yīng)要與之關(guān)聯(lián)一對(duì)一的表的對(duì)象類,即檔案表的類
foreignKey是在檔案表中,對(duì)應(yīng)學(xué)生表的一個(gè)外鍵接連字段,
用該字段標(biāo)識(shí)該檔案屬于哪個(gè)學(xué)生
mappingName 就是用于在你查詢學(xué)生信息時(shí),學(xué)生檔案字段的別名
*/
var $hasOne = array(
’tableClass’ => ‘Model_Record’,
’foreignKey’ => ’stu_id’,
’mappingName’ => ‘record’
);
/*
這是從屬關(guān)系,一個(gè)學(xué)生屬于某一個(gè)班級(jí),換過(guò)來(lái)說(shuō)就是班級(jí)與學(xué)生一對(duì)多,
一個(gè)班級(jí)有多個(gè)學(xué)生,而學(xué)生就只屬于一個(gè)班級(jí)
tableClass 指定該類要與之有從屬關(guān)系的類,這里是班級(jí)類
foreignKey 這里指定的是該表里的連接外表的字段,這里是學(xué)生表的班級(jí)ID字段
注意:這里的foreignKey指的是本表的字段,而上面hasOne關(guān)系中的foreignKey
指的是外表中的字段,要注意區(qū)分清楚
mappingName這里就不多說(shuō)了,跟上面的一樣,也是用于顯示區(qū)分的別名
*/
var $belongsTo = array(
array(
’tableClass’ => ‘Model_Classes’,
’foreignKey’ => ’stu_class_id’,
’mappingName’ => ‘class’
)
);
}//檔案表對(duì)應(yīng)的類
class Model_Record extends FLEA_Db_TableDataGateway{
var $tableName = ’stu_record’;
var $primaryKey = ‘record_id’;
}
//教師表對(duì)應(yīng)的類
class Model_Teacher extends FLEA_Db_TableDataGateway{
var $tableName = ‘teacher’;
var $primaryKey = ‘teacher_id’;
/*
這里確立了教師與班級(jí)的多對(duì)多關(guān)系,一個(gè)教師可以教多個(gè)班級(jí)
而一個(gè)班級(jí)也有多個(gè)教師
tableClass 指定要建立多對(duì)多關(guān)系的表的類
joinTable 這個(gè)屬性要注意一個(gè),這個(gè)是指定教師表與班級(jí)表關(guān)系的連接表
由于二維表的數(shù)據(jù)結(jié)構(gòu)的原因,所以多對(duì)多關(guān)系要用一個(gè)中間表(即連接表)來(lái)表示
連接表中就指明兩個(gè)表各自的主鍵ID就可以了,以兩個(gè)字段作復(fù)合主鍵,如不用復(fù)合
主鍵,就新增加一個(gè)字段作主鍵也可,這沒(méi)關(guān)系
*/
var $manyToMany = array(
array(
’tableClass’ => ‘Model_Classes’,
’mappingName’ => ‘class’,
’joinTable’ => ‘link_teacher_classes’,
)
);
}
class Model_Classes extends FLEA_Db_TableDataGateway{
var $tableName = ‘classes’;
var $primaryKey = ‘class_id’;
/*
這里確立了班級(jí)與學(xué)生的一對(duì)多關(guān)系
tableClass 指定該表的類要與哪個(gè)表的類建立一對(duì)多關(guān)系
foreignKey 外鍵ID,這里即指定學(xué)生表中定義的班級(jí)ID,這個(gè)是外表的字段
*/
var $hasMany = array(
array(
’tableClass’ => ‘Model_Student’,
’foreignKey’ => ’stu_class_id’,
’mappingName’ => ’students’
)
);
var $manyToMany = array(
// 由于多對(duì)多關(guān)系是雙向的,所以班級(jí)表也可以定義上與教師表的多對(duì)多關(guān)系
// 也可以不寫,看需求而定,比如你想查看某個(gè)班級(jí)信息時(shí),一并顯示該班
// 有多少個(gè)任課老師的話,那就在這個(gè)班級(jí)類里加上關(guān)系,我這里就不寫了。。。
);
}
以上的代碼就建立好了關(guān)系了,現(xiàn)在只管使用就是了。
不過(guò)還提醒大家一點(diǎn),在每個(gè)關(guān)系里,都有一個(gè) ‘enabled’ 的屬性,如果設(shè)置為 false的話,則是將該關(guān)系禁掉,所以查詢出來(lái)的結(jié)果就沒(méi)有該關(guān)系的相應(yīng)數(shù)據(jù),這樣可以節(jié)省效率,按需要時(shí)才打開(kāi)相應(yīng)的關(guān)聯(lián),該屬性默認(rèn)為true 可以如下設(shè)置:
現(xiàn)在我們來(lái)測(cè)試一下數(shù)據(jù)。(事先自行插入幾行數(shù)據(jù)用以測(cè)試)
FleaPHP的數(shù)據(jù)庫(kù)查詢條件$conditions 參數(shù)可以是整數(shù)、字符串和數(shù)組三種類型:
1.如果 $conditions 參數(shù)是一個(gè)整數(shù),則假定該整數(shù)為主鍵字段值。
view plaincopy to clipboardprint?
// 查詢主鍵字段值為1的記錄
$user = $tableUsers->find(1);
2.如果 $conditions 參數(shù)是一個(gè)字符串,則該字符串將直接作為查詢條件,這種方式可以支持最靈活的查詢條件。 例如:
view plaincopy to clipboardprint?
$conditions = 'id < 3'
$user = $tableUsers->find($conditions);
//生成的where字句為“WHERE id < 3”
3.1.如果 $conditions 參數(shù)是一個(gè)數(shù)組,且指定了鍵名和值,則查詢條件中字段名為鍵名,字段值等于鍵值。例如:
// 查詢id字段值為3的記錄
$conditions = array(
'id' => '1',
);
$user = $tableUsers->find($conditions);
//生成的where字句為“WHERE `id` = 1”
3.2.如果 $conditions 參數(shù)是一個(gè)數(shù)組,但其中的元素沒(méi)有鍵名, 則假定鍵值為自定義查詢條件,例如:
$conditions = array('id = 1');
// 生成的where字句為“WHERE `id` = 1”
$user = $tableUsers->find($conditions);
3.3.$conditions 為數(shù)組時(shí),可以混用字符串和鍵值對(duì)兩種風(fēng)格:
$conditions = array(
'id < 3',
'sex' => 'male',
);
$user = $tableUsers->find($conditions);
// 生成的where字句為“id < 3 AND `sex` = 'male'”
$conditions = array( 'id < 3', 'sex' => 'male',);$user = $tableUsers->find($conditions);// 生成的where字句為“id < 3 AND `sex` = 'male'”
$conditions 為數(shù)組時(shí),多個(gè)查詢條件之間將使用 AND 布爾運(yùn)算符進(jìn)行連接。
3.4.“in()”查詢?cè)贔leaPHP中的實(shí)現(xiàn)
我們有時(shí)候要用到in這樣的操作,那么在condition里面怎么寫呢?
// 假如主鍵名為“id”,需要查詢id的值為1、2、3其中之一,則可以這樣寫:
$condition = array(
'in()' => array(1,2,3),
)
那么如果不是主鍵的話怎么寫了呢? 也很簡(jiǎn)單,提供鍵值對(duì)即可。例如:
view plaincopy to clipboardprint?
$condition = array(
'in()' => array(
'username' => array('username1','username2')
)
)
3.5 or查詢的實(shí)現(xiàn)
當(dāng) $conditions 包含多個(gè)元素時(shí),每一個(gè)數(shù)組元素都是下列格式的數(shù)組:
array(字段名, 值, 比較操作, 連接下一個(gè)條件的操作, 是否是自定義命令)如果“是否是自定義命令”為 true,則“字段名”為自定義的查詢條件,而“值”和“比較操作”兩項(xiàng)將被忽略。
“比較操作”的默認(rèn)值是“=”;
“連接下一個(gè)條件的操作”的默認(rèn)值是“AND”;
“是否是自定義命令”的默認(rèn)值是 false。
$conditions = array(
array('username', 'dualface', '=', 'OR'),
array('user_level', 'vip', '>='),
);
生成的 sql 如下
WHERE `username` = 'dualface' OR `user_level` >= 'vip'
實(shí)例代碼:
$conditions =array(
array('Field1','Value1','LIKE','OR'),
array('Field2','Value2','=','OR'),
array('Field3','Value3','>'),
);
3.6.關(guān)聯(lián)表限制條件
上面介紹的都是相對(duì)于主表而言的,那么我們?nèi)绾蝸?lái)操作關(guān)聯(lián)表的條件呢?我們來(lái)看下面
$conditions =array(
array('Field1','Value1','LIKE','OR'),
array('mappingName.Field',$this->primaryKey,'=','OR'), //這里的field是指關(guān)聯(lián)表中的字段 ,mappingName就是定義關(guān)聯(lián)時(shí)候那個(gè)影像別名
array('Field2','Value2','>'),
);
4.find(),findAll()函數(shù)中其它參數(shù)的含義和用法如下:
find ( $ conditions,
$ sort = null,
$ fields = '*',
$ queryLinks = true
)
findAll ( $ conditions = null,
$ sort = null,
$ limit = null,
$ fields = '*',
$ queryLinks = true
)
4.1.$sort 參數(shù)指定查詢時(shí)的排序方式,類型只能為字符串
例如 'created ASC' 表示按照“created”字段進(jìn)行從小到大的排序。
4.2.$fields 參數(shù)指定查詢結(jié)果中要包含哪些字段,類型可以為字符串或數(shù)組
當(dāng)數(shù)據(jù)表的字段很多時(shí),通過(guò)指定 $fields 參數(shù)可以避免查詢不需要的字段,從而提高性能。
$fields 參數(shù)即可是以“,”逗號(hào)分隔的字段名,也可以是包含多個(gè)字段名的數(shù)組,例如:
$fields = array('title', 'created');
//也可以寫成下面的字符串形式,兩種寫法作用相同,區(qū)別在于自動(dòng)生成的字段名兩邊將會(huì)添加上“`”符號(hào),以防止出現(xiàn)字段名與SQL關(guān)鍵字沖突的情況出現(xiàn)。建議手寫時(shí)也加上“`”字符
$fields = 'title, created';
$user = $tableUsers->find('id < 10',NULL,$fields);
$fields = array('title', 'created');//也可以寫成下面的字符串形式,兩種寫法作用相同,區(qū)別在于自動(dòng)生成的字段名兩邊將會(huì)添加上“`”符號(hào),以防止出現(xiàn)字段名與SQL關(guān)鍵字沖突的情況出現(xiàn)。建議手寫時(shí)也加上“`”字符$fields = 'title, created';$user = $tableUsers->find('id < 10',NULL,$fields);
推薦使用數(shù)組,這樣表數(shù)據(jù)入口處理起來(lái)更快一些。
4.3.$queryLinks表示是否啟用關(guān)聯(lián)查詢,默認(rèn)是啟用的,即默認(rèn)會(huì)查詢關(guān)聯(lián)表(前提是關(guān)聯(lián)設(shè)置屬性enabled是開(kāi)啟狀態(tài))
下一篇文章將討論一下FleaPHP的數(shù)據(jù)表關(guān)聯(lián)設(shè)置
]]>00662 function & initWebControls()
00663 {
00664 return FLEA::getSingleton(FLEA::getAppInf('webControlsClassName'));
00665 }
'webControlsClassName'默認(rèn)是FLEA目錄下的webControls類,該類封裝了頁(yè)面組件的實(shí)現(xiàn),以及一些常用的頁(yè)面控件,在找不到這些自帶控件的時(shí)候就會(huì)去嘗試搜索我們自定義的以_ctl開(kāi)頭的控件
/**
* 構(gòu)造一個(gè)控件的 HTML 代碼
*
* @param string $type
* @param string $name
* @param array $attribs
* @param boolean $return
*
* @return string
*/
function control($type, $name, $attribs = null, $return = false)
{
$type = strtolower($type);
$render = '_ctl' . ucfirst($type);
$attribs = (array)$attribs;
$__ctl_out = false;
if (method_exists($this, $render)) {
$__ctl_out = $this->{$render}($name, $attribs);
} else {
$extfilename = ucfirst($type) . '.php';
if (!isset($this->_extends[$type])) {
foreach ($this->_extendsDir as $dir) {
if (file_exists($dir . DS . $extfilename)) {
require($dir . DS . $extfilename);
$this->_extends[$type] = true;
break;
}
}
}
if (isset($this->_extends[$type])) {
$__ctl_out = call_user_func_array($render,
array('name' => $name, 'attribs' => $attribs));
}
}
if ($__ctl_out === false) {
$__ctl_out = "INVALID CONTROL TYPE \"{$type}\"";
}
if ($return) { return $__ctl_out; }
echo $__ctl_out;
return '';
}
實(shí)例化控件之后,在模版(也就是 .php)中:
如果使用smarty,調(diào)用方式就是:
{ webcontrol type='textbox' value=$textbox_value }
系統(tǒng)會(huì)自動(dòng)去實(shí)例化控件對(duì)象
]]>FLEA::setAppInf('dispatcherFailedCallback', 'onDispatcherFailed');
function onDispatcherFailed
{
redirect('404.html');
}
dispatcherFailedCallback的配置分2種情況,如果當(dāng)前訪問(wèn)的控制器、動(dòng)作不存:'dispatcherFailedCallback' => 'onDispatcherFailedCallback',
如果用戶設(shè)置了RABC訪問(wèn)控制,訪問(wèn)無(wú)法訪問(wèn)的動(dòng)作時(shí):'dispatcherAuthFailedCallback' => 'onAuthFailedCallback',
上面onDispatcherFailedCallback、onAuthFailedCallback是出錯(cuò)的時(shí)候調(diào)用的函數(shù),你可以在index.php種定義這2個(gè)函數(shù)就OK了。
例如:
function onAuthFailedCallback($controller,$action)
{redirect(url('Login','Index')); // 這里是驗(yàn)證失敗時(shí),讓用戶去登錄
}