<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>最优良人 &#187; fleaphp</title>
	<atom:link href="http://www.zui88.com/view-tag/fleaphp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.zui88.com/blog</link>
	<description>中山php&#124;最优网络</description>
	<lastBuildDate>Mon, 13 May 2013 04:56:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>FleaPHP如何定义表关联以及关联的简写</title>
		<link>http://www.zui88.com/blog/view-259.html</link>
		<comments>http://www.zui88.com/blog/view-259.html#comments</comments>
		<pubDate>Tue, 06 Sep 2011 10:06:23 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[fleaphp]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=259</guid>
		<description><![CDATA[定义从属关联 1、外键放置在主表中； 2、保存时不会自动更新关联表的记录； 3、删除时也不会更新关联表的记录。 示例： 多个文章都属于某一个栏目。 格式一： * class Articles * { * var $belongsTo = array( * array( * ’tableClass’ =&#62; ‘Columns’, * ’foreignKey’ =&#62; ‘column_id’, * ’mappingName’ =&#62; ‘column’ * ), * ); * } 在上面的格式中，foreignKey 表示在当前表中用什么字段存储对关联表的主键引用。 mappingName 表示在主表的返回结果中，以什么名字保存关联表的数据。 如果不提供 mappingName 参数，则假定使用 tableClass。 格式二： * class Articles * { * var $belongsTo = [...]]]></description>
			<content:encoded><![CDATA[<div id="sina_keyword_ad_area2">
<p>定义从属关联</p>
<p>1、外键放置在主表中；<br />
2、保存时不会自动更新关联表的记录；<br />
3、删除时也不会更新关联表的记录。</p>
<p>示例：<br />
多个文章都属于某一个栏目。</p>
<p>格式一：</p>
<p>* class Articles<br />
* {<br />
*      var $belongsTo = array(<br />
*          array(<br />
*              ’tableClass’  =&gt; ‘Columns’,<br />
*              ’foreignKey’  =&gt; ‘column_id’,<br />
*              ’mappingName’ =&gt; ‘column’<br />
*          ),<br />
*      );<br />
* }<br />
<a id="entrymore" name="entrymore"></a></p>
<p>在上面的格式中，foreignKey 表示在当前表中用什么字段存储对关联表的主键引用。<br />
mappingName 表示在主表的返回结果中，以什么名字保存关联表的数据。<br />
如果不提供 mappingName 参数，则假定使用 tableClass。</p>
<p>格式二：</p>
<p>* class Articles<br />
* {<br />
*      var $belongsTo = ‘Columns’;<br />
* }</p>
<p>格式二是一种简化写法。foreignKey 字段名将和关联表的主键字段名相同。</p>
<p>============================</p>
<p>$hasMany</p>
<p>定义一对多关联</p>
<p>1、外键保存在关联表中；<br />
2、保存时自动更新关联表的记录；<br />
3、删除主表记录时自动删除关联记录。</p>
<p>示例：<br />
每个用户（user）有多张订单 order。</p>
<p>格式一：</p>
<p>* class Users<br />
* {<br />
*      var $hasMany = array(<br />
*          array(<br />
*              ’tableClass’  =&gt; ‘Orders’,<br />
*              ’foreignKey’  =&gt; ‘user_id’,<br />
*              ’mappingName’ =&gt; ‘orders’,<br />
*          ),<br />
*      );<br />
* }</p>
<p>在一对多关系中，当前表并不包含对关联表的主键引用。<br />
而是在关联表中保存对当前表的主键引用。<br />
在上面的格式中，foreignKey 指示在关联表中用什么字段存储对当前表的主键引用。<br />
mappingName 表示在主表的返回结果中，以什么名字保存关联表的数据。<br />
如果不提供 mappingName 参数，则假定使用 tableClass。</p>
<p>格式二：</p>
<p>* class Users<br />
* {<br />
*      var $hasMany = ‘Orders’;<br />
* }</p>
<p>简化写法中，foreignKey 字段名将和当前表的主键字段名相同。</p>
<p>============================</p>
<p>$hasOne</p>
<p>定义一对一关联<br />
1、外键放置在关联表中；<br />
2、保存时如果有关联对象，则自动创建或更新关联表的记录；<br />
3、删除主表记录时自动删除关联记录。</p>
<p>示例：<br />
当前表为 users，用于存储用户账户。而每个用户账户有且只有一个对应的个人信息（profile）记录。</p>
<p>格式一：</p>
<p>* class Users<br />
* {<br />
*      var $hasOne = array(<br />
*          array(<br />
*              ’tableClass’  =&gt; ‘Profiles’,<br />
*              ’foreignKey’  =&gt; ‘profile_id’,<br />
*              ’mappingName’ =&gt; ‘profile’,<br />
*          ),<br />
*      );<br />
* }</p>
<p>在上面的格式中，foreignKey 表示在关联表中用什么字段存储对主表的主键引用。  mappingName 表示在主表的返回结果中，以什么名字保存关联表的数据。  如果不提供 mappingName 参数，则假定使用 tableClass。</p>
<p>格式二：</p>
<p>* class Users<br />
* {<br />
*      var $hasOne = ‘Profiles’;<br />
* }</p>
<p>格式二是一种简化写法。foreignKey 字段名将和主表的主键字段名名相同。</p>
<p>============================</p>
<p>$manyToMany</p>
<p>定义多对多关联</p>
<p>1、外键保存在中间表里面；<br />
2、保存时自动更新中间表；<br />
3、删除主表记录时自动删除中间表的相关记录。</p>
<p>示例：<br />
每个成员（member）可以拥有多个角色（role），而每个角色也可以指定给多个成员。</p>
<p>格式一：</p>
<p>* class Members<br />
* {<br />
*      var $manyToMany = array(<br />
*          array(<br />
*              ’tableClass’      =&gt; ‘Roles’,<br />
*              ’joinTable’       =&gt; ‘member_roles’,<br />
*              ’foreignKey’      =&gt; ‘member_id’,<br />
*              ’assocforeignKey’ =&gt; ‘role_id’,<br />
*              ’mappingName’     =&gt; ‘roles’,<br />
*          ),<br />
*      );<br />
* }</p>
<p>在多对多关系中，当前表并不包含对关联表的主键引用。<br />
而是在一个中间表里面保存对当前表和关联表的主键引用。<br />
在上面的格式中，joinTable 表示中间表的名字。foreignKey 和<br />
assocforeignKey 分别表示在中间表里面用什么字段存储对主表和<br />
关联表主键字段的引用。</p>
<p>mappingName 表示在主表的返回结果中，以什么名字保存关联表的数据。<br />
如果不提供 mappingName 参数，则假定使用 tableClass。</p>
<p>格式二：</p>
<p>* class Members<br />
* {<br />
*      var $manyToMany = ‘Roles’;<br />
* }</p>
<p>简化写法中，foreignKey 字段名将和当前表的主键字段名相同。<br />
assocforeignKey字段名称则和关联数据表的主键字段名相同。<br />
而中间表名称将用FLEA_Db_TableDataGateway::getMidtableName() 方法计算。</p>
<p>hasOne 是一对多关联，表示一条主表记录有一条对应的关联记录。<br />
而 belongsTo 是从属关联，表示一条主表记录属于另一条关联记录。</p>
<p>hasOne 和 belongsTo 正好是相反的关系。</p>
<p>例如 “一个用户”有一个“个人空间”。那么一个“个人空间”就属于“一个用户”。</p>
<p>由于 hasOne 实际上是 hasMany （一对多）关联的一种特例，所以 belongsTo 和 hasMany 也是相反的关系。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-259.html/feed</wfw:commentRss>
		<slash:comments>312</slash:comments>
		</item>
		<item>
		<title>FleaPHP数据表关联设置</title>
		<link>http://www.zui88.com/blog/view-256.html</link>
		<comments>http://www.zui88.com/blog/view-256.html#comments</comments>
		<pubDate>Tue, 06 Sep 2011 08:13:20 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[fleaphp]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=256</guid>
		<description><![CDATA[目前，FleaPHP支持四种类型的数据表关联，分别是： HAS_ONE： 当前表的每一条记录都拥有最多一条（0–1）关联记录 HAS_MANY： 当前表的每一条记录都拥有多条（0-n）关联记录 MANY_TO_MANY： 当前表的每一条记录都和其他表的多条（0-n）记录关联 BELONGS_TO： 当前表的每一条记录都属于另一个表的某条记录 关联中必须设置的属性为： ‘name’, // 关联的名字（如：hasOne、hasMany） ‘tableClass’, // 关联的表数据入口对象名 ‘mappingName’, // 字段映射名 可选属性： ‘foreignKey’, //外键字段名 ’sort’, //对关联表进行查询时使用的排序参数 ‘conditions’, //对关联表进行查询时使用的条件参数 ‘fields’, //对关联表进行查询时要获取的关联表字段 ‘limit’, //对关联表进行查询时限制查出的记录数 ‘enabled’, //是否处理关联，设置为falses时，不处理该表入口的任何关联。enabled 的优先级高于 linkRead、linkCreate、linkUpdate 和 linkRemove。 ‘countOnly’, //指示在查询关联表时是否仅仅统计记录数，而不实际查询数据 ‘counterCache’, //将关联记录总数缓存到指定的字段,数据表中要建立相应的字段 ‘linkRead’, //指示是否在主表读取记录时也读取该关联对应的关联表的记录,默认ture ‘linkCreate’, //指示是否在主表创建记录时也创建该关联对应的关联表的记录,默认ture ‘linkUpdate’, //指示是否在主表更新记录时也更新该关联对应的关联表的记录,默认ture ‘linkRemove’, //指示是否在主表删除记录时也删除该关联对应的关联表的记录,默认ture ‘linkRemoveFillValue’, //当删除主表记录而不删除关联表记录时，用什么值填充关联表记录的外键字段,默认0 ’saveAssocMethod’, //指示当保存关联数据时，采用何种方法，默认为 save，可以设置为 create、update 或 [...]]]></description>
			<content:encoded><![CDATA[<p>目前，FleaPHP支持四种类型的数据表关联，分别是：</p>
<p>HAS_ONE：      当前表的每一条记录都拥有最多一条（0–1）关联记录<br />
HAS_MANY：     当前表的每一条记录都拥有多条（0-n）关联记录<br />
MANY_TO_MANY： 当前表的每一条记录都和其他表的多条（0-n）记录关联<br />
BELONGS_TO：   当前表的每一条记录都属于另一个表的某条记录</p>
<p>关联中必须设置的属性为：<br />
‘name’,             // 关联的名字（如：hasOne、hasMany）<br />
‘tableClass’,       // 关联的表数据入口对象名<br />
‘mappingName’,      // 字段映射名</p>
<p>可选属性：<br />
‘foreignKey’,       //外键字段名<br />
’sort’,             //对关联表进行查询时使用的排序参数<br />
‘conditions’,       //对关联表进行查询时使用的条件参数<br />
‘fields’,           //对关联表进行查询时要获取的关联表字段<br />
‘limit’,            //对关联表进行查询时限制查出的记录数<br />
‘enabled’,          //是否处理关联，设置为falses时，不处理该表入口的任何关联。enabled 的优先级高于 linkRead、linkCreate、linkUpdate 和 linkRemove。<br />
‘countOnly’,        //指示在查询关联表时是否仅仅统计记录数，而不实际查询数据<br />
‘counterCache’,     //将关联记录总数缓存到指定的字段,数据表中要建立相应的字段<br />
‘linkRead’,         //指示是否在主表读取记录时也读取该关联对应的关联表的记录,默认ture<br />
‘linkCreate’,       //指示是否在主表创建记录时也创建该关联对应的关联表的记录,默认ture<br />
‘linkUpdate’,       //指示是否在主表更新记录时也更新该关联对应的关联表的记录,默认ture<br />
‘linkRemove’,       //指示是否在主表删除记录时也删除该关联对应的关联表的记录,默认ture<br />
‘linkRemoveFillValue’, //当删除主表记录而不删除关联表记录时，用什么值填充关联表记录的外键字段,默认0<br />
’saveAssocMethod’,      //指示当保存关联数据时，采用何种方法，默认为 save，可以设置为 create、update 或 replacevar $belongsTo = array(<br />
‘tableClass’    =&gt; ‘Table_Users’,<br />
‘mappingName’   =&gt; ‘author’,<br />
‘foreignKey’    =&gt; ‘user_id’<br />
);</p>
<p>var $hasOne = array(<br />
‘tableClass’     =&gt; ‘Table_Profiles’,<br />
‘mappingName’    =&gt; ‘profiles’,<br />
‘foreignKey’     =&gt; ‘user_id’,<br />
’saveAssocMethod’=&gt; ’save’<br />
);</p>
<p>var $hasMany = array(<br />
‘tableClass’     =&gt; ‘Table_Profiles’,<br />
‘mappingName’    =&gt; ‘profiles’,<br />
‘foreignKey’     =&gt; ‘user_id’,<br />
’saveAssocMethod’=&gt; ’save’<br />
);</p>
<p>var $manyToMany=array(</p>
<p>);</p>
<p>一个表可以有多个关联<br />
var $hasMany = array(<br />
array(<br />
‘tableClass’ =&gt; ‘Model_Permissions’,<br />
‘foreignKey’ =&gt; ‘pclass_id’,<br />
‘mappingName’ =&gt; ‘permissions’,<br />
),<br />
array(<br />
‘tableClass’ =&gt; ‘Model_Products’,<br />
‘foreignKey’ =&gt; ‘pclass_id’,<br />
‘mappingName’ =&gt; ‘products’,<br />
‘enabled’ =&gt; false,<br />
),<br />
[<br />
array(<br />
...<br />
),<br />
]<br />
);<br />
关联： 一个关联是一个关系，这个关系属于某一个数据表。例如 users 表可能就拥有一个或者多个关联。<br />
主表： 对于一个关联，拥有该关联的数据表就是主表。例如 posts 表定义了一个 MANY_TO_MANY 关联。<br />
那么在这里（指这个关联），posts 就是主表。</p>
<p>关联表： 在一个关联中，关联表就是除主表外的另一个表。<br />
外键： 在数据库原理中，外键的含义很复杂。但在 FleaPHP 框架中的数据库关联功能中，<br />
外键泛指一个记录中用于关联另一个记录的字段。例如 profile 表中的 user_id 字段就是用于关联 users 表的字段。<br />
这个 user_id 字段就是一个外键。</p>
<p>中间表： 在 MANY_TO_MANY 关联中，除了主表和关联表，还需要另一个表来保存这两个表的记录之间的互相关联关系。<br />
这个表称为中间表。<br />
HAS_ONE 一对一关联<br />
HAS_ONE 是一种非常简单的关联关系。表示一个记录拥有另一个记录。这两个记录分别位于两个数据表中。</p>
<p>示例<br />
在一个信息管理系统中，users 表用于存储用户帐户的基本信息，例如用户名、密码等。<br />
而 profiles 表则用于存储用户的个人信息，例如家庭住址、邮政编码等。</p>
<p>由于每一个用户（一条 users 表中的记录）都有一份对应的个人信息（一条 profiles 表中的记录）。<br />
因此，我们就可以为 users 表定义一个 HAS_ONE 关联。</p>
<p>很明显，users 表的记录拥有一条 profiles 表的记录。因此，当 users 表中的一条记录被删除时，<br />
被删除记录所拥有的 profiles 表中的关联记录也会被自动删除。</p>
<p>表定义<br />
在 HAS_ONE 关联中，要求外键放置在关联表中</p>
<p>分别对应FLEA_Db_TableDataGateway表中的 $hasOne,$hasMany,$manyToMany,$belongsTo 属性</p>
<p>我们下面就用 老师，学生，学生档案，班级的例子说说这几个关系。</p>
<p>以下是SQL代码：</p>
<div class="UBBPanel">
<div class="UBBContent">//学生表<br />
Create TABLE `testDB`.`student` (<br />
`stu_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,<br />
`stu_name` VARCHAR(20) NOT NULL,<br />
`stu_class_id` INTEGER UNSIGNED NOT NULL,<br />
PRIMARY KEY (`stu_id`)<br />
)//学生档案表<br />
Create TABLE `testDB`.`stu_record` (<br />
`record_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,<br />
`stu_id` INTEGER UNSIGNED NOT NULL,<br />
`family_add` VARCHAR(150) NULL,<br />
`family_tel` VARCHAR(20) NULL,<br />
PRIMARY KEY (`record_id`)<br />
)</p>
<p>//教师表<br />
Create TABLE `testDB`.`teacher` (<br />
`teacher_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,<br />
`teacher_name` VARCHAR(20) NOT NULL,<br />
PRIMARY KEY (`teacher_id`)<br />
)</p>
<p>//班级表<br />
Create TABLE `testDB`.`classes` (<br />
`class_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,<br />
`class_name` VARCHAR(20) NOT NULL,<br />
PRIMARY KEY (`class_id`)<br />
)</p>
<p>//由于教师与班级是多对多关系，所有建立一个中间连接表以表示该关联<br />
Create TABLE `testDB`.`link_teacher_classes` (<br />
`link_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,<br />
`teacher_id` INTEGER UNSIGNED NOT NULL,<br />
`class_id` INTEGER UNSIGNED NOT NULL,<br />
PRIMARY KEY (`link_id`)<br />
)</p>
</div>
</div>
<p>现在，建好表之后，我们还要写几个继承自FLEA_Db_TableDataGateway父类的类，以对应数据库中的Student，Teacher，Classes表（连接表不用了）如下：</p>
<div class="UBBPanel">
<div class="UBBContent">//学生表对应的类<br />
class Model_Student extends FLEA_Db_TableDataGateway{<br />
var $tableName = ’student’;<br />
var $primaryKey = ’stu_id’;</p>
<p>/*<br />
这是一对一关系，一个学生对应唯一的一个Record档案<br />
tableClass 对应要与之关联一对一的表的对象类，即档案表的类<br />
foreignKey是在档案表中，对应学生表的一个外键接连字段，<br />
用该字段标识该档案属于哪个学生<br />
mappingName 就是用于在你查询学生信息时，学生档案字段的别名<br />
*/<br />
var $hasOne = array(<br />
’tableClass’ =&gt; ‘Model_Record’,<br />
’foreignKey’ =&gt; ’stu_id’,<br />
’mappingName’ =&gt; ‘record’<br />
);<br />
/*<br />
这是从属关系，一个学生属于某一个班级，换过来说就是班级与学生一对多，<br />
一个班级有多个学生，而学生就只属于一个班级<br />
tableClass 指定该类要与之有从属关系的类，这里是班级类<br />
foreignKey 这里指定的是该表里的连接外表的字段，这里是学生表的班级ID字段<br />
注意：这里的foreignKey指的是本表的字段，而上面hasOne关系中的foreignKey<br />
指的是外表中的字段，要注意区分清楚<br />
mappingName这里就不多说了，跟上面的一样，也是用于显示区分的别名<br />
*/<br />
var $belongsTo = array(<br />
array(<br />
’tableClass’ =&gt; ‘Model_Classes’,<br />
’foreignKey’ =&gt; ’stu_class_id’,<br />
’mappingName’ =&gt; ‘class’<br />
)<br />
);<br />
}//档案表对应的类<br />
class Model_Record extends FLEA_Db_TableDataGateway{<br />
var $tableName = ’stu_record’;<br />
var $primaryKey = ‘record_id’;<br />
}</p>
<p>//教师表对应的类<br />
class Model_Teacher extends FLEA_Db_TableDataGateway{<br />
var $tableName = ‘teacher’;<br />
var $primaryKey = ‘teacher_id’;</p>
<p>/*<br />
这里确立了教师与班级的多对多关系，一个教师可以教多个班级<br />
而一个班级也有多个教师<br />
tableClass 指定要建立多对多关系的表的类<br />
joinTable 这个属性要注意一个，这个是指定教师表与班级表关系的连接表<br />
由于二维表的数据结构的原因，所以多对多关系要用一个中间表（即连接表）来表示<br />
连接表中就指明两个表各自的主键ID就可以了，以两个字段作复合主键，如不用复合<br />
主键，就新增加一个字段作主键也可，这没关系<br />
*/<br />
var $manyToMany = array(<br />
array(<br />
’tableClass’ =&gt; ‘Model_Classes’,<br />
’mappingName’ =&gt; ‘class’,<br />
’joinTable’ =&gt; ‘link_teacher_classes’,<br />
)<br />
);<br />
}</p>
<p>class Model_Classes extends FLEA_Db_TableDataGateway{<br />
var $tableName = ‘classes’;<br />
var $primaryKey = ‘class_id’;</p>
<p>/*<br />
这里确立了班级与学生的一对多关系<br />
tableClass 指定该表的类要与哪个表的类建立一对多关系<br />
foreignKey 外键ID，这里即指定学生表中定义的班级ID，这个是外表的字段<br />
*/<br />
var $hasMany = array(<br />
array(<br />
’tableClass’ =&gt; ‘Model_Student’,<br />
’foreignKey’ =&gt; ’stu_class_id’,<br />
’mappingName’ =&gt; ’students’<br />
)<br />
);</p>
<p>var $manyToMany = array(<br />
// 由于多对多关系是双向的，所以班级表也可以定义上与教师表的多对多关系<br />
// 也可以不写，看需求而定，比如你想查看某个班级信息时，一并显示该班<br />
// 有多少个任课老师的话，那就在这个班级类里加上关系，我这里就不写了。。。<br />
);<br />
}</p>
</div>
</div>
<p>以上的代码就建立好了关系了，现在只管使用就是了。<br />
不过还提醒大家一点，在每个关系里，都有一个 ‘enabled’ 的属性，如果设置为 false的话，则是将该关系禁掉，所以查询出来的结果就没有该关系的相应数据，这样可以节省效率，按需要时才打开相应的关联，该属性默认为true 可以如下设置：</p>
<div class="UBBPanel">
<div class="UBBContent">array(<br />
’tableClass’ =&gt; ‘Model_Student’,<br />
’foreignKey’ =&gt; ’stu_class_id’,<br />
’mappingName’ =&gt; ’students’,<br />
‘enabled’ =&gt; false<br />
)</div>
</div>
<p>现在我们来测试一下数据。（事先自行插入几行数据用以测试）</p>
<div class="UBBPanel">
<div class="UBBContent">$classManager = FLEA::getSingleton(‘Model_Classes’);<br />
$class =&amp; $classManager-&gt;find(array(‘class_id’ =&gt; 1));<br />
dump($class);</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-256.html/feed</wfw:commentRss>
		<slash:comments>365</slash:comments>
		</item>
		<item>
		<title>FleaPHP的数据库查询条件汇总解析</title>
		<link>http://www.zui88.com/blog/view-254.html</link>
		<comments>http://www.zui88.com/blog/view-254.html#comments</comments>
		<pubDate>Tue, 06 Sep 2011 08:10:46 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[fleaphp]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=254</guid>
		<description><![CDATA[本文将全面分析FleaPHP的数据库查询条件，包含字符串格式，数组格式，混合格式，in查询，or查询，关联查询等常用查询。 FleaPHP的数据库查询条件$conditions 参数可以是整数、字符串和数组三种类型： 1.如果 $conditions 参数是一个整数，则假定该整数为主键字段值。 view plaincopy to clipboardprint? // 查询主键字段值为1的记录 $user = $tableUsers-&#62;find(1); 2.如果 $conditions 参数是一个字符串，则该字符串将直接作为查询条件，这种方式可以支持最灵活的查询条件。 例如： view plaincopy to clipboardprint? $conditions = 'id &#60; 3' $user = $tableUsers-&#62;find($conditions); //生成的where字句为“WHERE id &#60; 3” 3.1.如果 $conditions 参数是一个数组，且指定了键名和值，则查询条件中字段名为键名，字段值等于键值。例如： // 查询id字段值为3的记录 $conditions = array( 'id' =&#62; '1', ); $user = $tableUsers-&#62;find($conditions); //生成的where字句为“WHERE `id` = 1” 3.2.如果 [...]]]></description>
			<content:encoded><![CDATA[<p>本文将全面分析FleaPHP的数据库查询条件，包含字符串格式，数组格式，混合格式，in查询，or查询，关联查询等常用查询。</p>
<p>FleaPHP的数据库查询条件$conditions 参数可以是整数、字符串和数组三种类型：</p>
<p>1.如果 $conditions 参数是一个整数，则假定该整数为主键字段值。<br />
view plaincopy to clipboardprint?<br />
// 查询主键字段值为1的记录<br />
$user = $tableUsers-&gt;find(1);</p>
<p>2.如果 $conditions 参数是一个字符串，则该字符串将直接作为查询条件，这种方式可以支持最灵活的查询条件。 例如：<br />
view plaincopy to clipboardprint?<br />
$conditions = 'id &lt; 3'<br />
$user = $tableUsers-&gt;find($conditions);<br />
//生成的where字句为“WHERE id &lt; 3”</p>
<p>3.1.如果 $conditions 参数是一个数组，且指定了键名和值，则查询条件中字段名为键名，字段值等于键值。例如：</p>
<p>// 查询id字段值为3的记录<br />
$conditions = array(<br />
'id' =&gt; '1',<br />
);<br />
$user = $tableUsers-&gt;find($conditions);<br />
//生成的where字句为“WHERE `id` = 1”</p>
<p>3.2.如果 $conditions 参数是一个数组，但其中的元素没有键名， 则假定键值为自定义查询条件，例如：</p>
<p>$conditions = array('id = 1');<br />
// 生成的where字句为“WHERE `id` = 1”<br />
$user = $tableUsers-&gt;find($conditions);</p>
<p>3.3.$conditions 为数组时，可以混用字符串和键值对两种风格：</p>
<p>$conditions = array(<br />
'id &lt; 3',<br />
'sex' =&gt; 'male',<br />
);<br />
$user = $tableUsers-&gt;find($conditions);<br />
// 生成的where字句为“id &lt; 3 AND `sex` = 'male'”<br />
$conditions = array(   'id &lt; 3',   'sex' =&gt; 'male',);$user = $tableUsers-&gt;find($conditions);// 生成的where字句为“id &lt; 3 AND `sex` = 'male'”<br />
$conditions 为数组时，多个查询条件之间将使用 AND 布尔运算符进行连接。</p>
<p>3.4.“in()”查询在FleaPHP中的实现</p>
<p>我们有时候要用到in这样的操作,那么在condition里面怎么写呢?</p>
<p>// 假如主键名为“id”，需要查询id的值为1、2、3其中之一，则可以这样写：<br />
$condition = array(<br />
'in()' =&gt; array(1,2,3),<br />
)</p>
<p>那么如果不是主键的话怎么写了呢? 也很简单，提供键值对即可。例如：<br />
view plaincopy to clipboardprint?<br />
$condition = array(<br />
'in()' =&gt; array(<br />
'username' =&gt; array('username1','username2')<br />
)<br />
)</p>
<p>3.5 or查询的实现</p>
<p>当 $conditions 包含多个元素时，每一个数组元素都是下列格式的数组：<br />
array(字段名, 值, 比较操作, 连接下一个条件的操作, 是否是自定义命令)如果“是否是自定义命令”为 true，则“字段名”为自定义的查询条件，而“值”和“比较操作”两项将被忽略。<br />
“比较操作”的默认值是“=”；<br />
“连接下一个条件的操作”的默认值是“AND”；<br />
“是否是自定义命令”的默认值是 false。</p>
<p>$conditions = array(<br />
array('username', 'dualface', '=', 'OR'),<br />
array('user_level', 'vip', '&gt;='),<br />
);</p>
<p>生成的 sql 如下</p>
<p>WHERE `username` = 'dualface' OR `user_level` &gt;= 'vip'</p>
<p>实例代码:<br />
$conditions =array(<br />
array('Field1','Value1','LIKE','OR'),<br />
array('Field2','Value2','=','OR'),<br />
array('Field3','Value3','&gt;'),<br />
);</p>
<p>3.6.关联表限制条件</p>
<p>上面介绍的都是相对于主表而言的,那么我们如何来操作关联表的条件呢?我们来看下面<br />
$conditions =array(<br />
array('Field1','Value1','LIKE','OR'),<br />
array('mappingName.Field',$this-&gt;primaryKey,'=','OR'), //这里的field是指关联表中的字段 ,mappingName就是定义关联时候那个影像别名<br />
array('Field2','Value2','&gt;'),<br />
);</p>
<p>4.find(),findAll()函数中其它参数的含义和用法如下：<br />
find  ( $  conditions,<br />
$  sort = null,<br />
$  fields = '*',<br />
$  queryLinks = true<br />
)<br />
findAll  ( $  conditions = null,<br />
$  sort = null,<br />
$  limit = null,<br />
$  fields = '*',<br />
$  queryLinks = true<br />
)</p>
<p>4.1.$sort 参数指定查询时的排序方式，类型只能为字符串<br />
例如 'created ASC' 表示按照“created”字段进行从小到大的排序。</p>
<p>4.2.$fields 参数指定查询结果中要包含哪些字段，类型可以为字符串或数组<br />
当数据表的字段很多时，通过指定 $fields 参数可以避免查询不需要的字段，从而提高性能。<br />
$fields 参数即可是以“,”逗号分隔的字段名，也可以是包含多个字段名的数组，例如：</p>
<p>$fields = array('title', 'created');<br />
//也可以写成下面的字符串形式，两种写法作用相同，区别在于自动生成的字段名两边将会添加上“`”符号，以防止出现字段名与SQL关键字冲突的情况出现。建议手写时也加上“`”字符<br />
$fields = 'title, created';<br />
$user = $tableUsers-&gt;find('id &lt; 10',NULL,$fields);<br />
$fields = array('title', 'created');//也可以写成下面的字符串形式，两种写法作用相同，区别在于自动生成的字段名两边将会添加上“`”符号，以防止出现字段名与SQL关键字冲突的情况出现。建议手写时也加上“`”字符$fields = 'title, created';$user = $tableUsers-&gt;find('id &lt; 10',NULL,$fields);<br />
推荐使用数组，这样表数据入口处理起来更快一些。</p>
<p>4.3.$queryLinks表示是否启用关联查询，默认是启用的，即默认会查询关联表（前提是关联设置属性enabled是开启状态）</p>
<p>下一篇文章将讨论一下FleaPHP的数据表关联设置</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-254.html/feed</wfw:commentRss>
		<slash:comments>274</slash:comments>
		</item>
		<item>
		<title>FleaPHP页面控件 WebControls的使用</title>
		<link>http://www.zui88.com/blog/view-131.html</link>
		<comments>http://www.zui88.com/blog/view-131.html#comments</comments>
		<pubDate>Tue, 16 Aug 2011 02:31:18 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[fleaphp]]></category>
		<category><![CDATA[webcontrol]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=131</guid>
		<description><![CDATA[如果不使用模板引擎，需要先注册控件 $ui =&#38; FLEA::initWebControls() ;其实就是返回控件的实例，该函数的代码是 00662 function &#38; initWebControls() 00663 { 00664 return FLEA::getSingleton(FLEA::getAppInf('webControlsClassName')); 00665 } 'webControlsClassName'默认是FLEA目录下的webControls类，该类封装了页面组件的实现，以及一些常用的页面控件，在找不到这些自带控件的时候就会去尝试搜索我们自定义的以_ctl开头的控件 /** * 构造一个控件的 HTML 代码 * * @param string $type * @param string $name * @param array $attribs * @param boolean $return * * @return string */ function control($type, $name, $attribs = null, $return = false) { $type [...]]]></description>
			<content:encoded><![CDATA[<p>如果不使用模板引擎，需要先注册控件 $ui =&amp; FLEA::initWebControls() ;其实就是返回控件的实例，该函数的代码是</p>
<p><span style="color: #800080;">00662</span>     function &amp; <span style="color: #800080;">initWebControls</span>()<br />
<a name="l00663"></a>00663     {<br />
<a name="l00664"></a>00664         <span class="keywordflow">return</span> <span style="color: #800080;">FLEA::getSingleton</span>(<span style="color: #800080;">FLEA::getAppInf</span>('webControlsClassName'));<br />
<a name="l00665"></a>00665     }</p>
<p>'webControlsClassName'默认是FLEA目录下的webControls类，该类封装了页面组件的实现，以及一些常用的页面控件，在找不到这些自带控件的时候就会去尝试搜索我们自定义的以_ctl开头的控件</p>
<p>    /**<br />
     * 构造一个控件的 HTML 代码<br />
     *<br />
     * @param string $type<br />
     * @param string $name<br />
     * @param array $attribs<br />
     * @param boolean $return<br />
     *<br />
     * @return string<br />
     */<br />
    function control($type, $name, $attribs = null, $return = false)<br />
    {<br />
        $type = strtolower($type);<br />
        $render = '_ctl' . ucfirst($type);<br />
        $attribs = (array)$attribs;</p>
<p>        $__ctl_out = false;<br />
        if (method_exists($this, $render)) {<br />
            $__ctl_out = $this-&gt;{$render}($name, $attribs);<br />
        } else {<br />
            $extfilename = ucfirst($type) . '.php';<br />
            if (!isset($this-&gt;_extends[$type])) {<br />
                foreach ($this-&gt;_extendsDir as $dir) {<br />
                    if (file_exists($dir . DS . $extfilename)) {<br />
                        require($dir . DS . $extfilename);<br />
                        $this-&gt;_extends[$type] = true;<br />
                        break;<br />
                    }<br />
                }<br />
            }</p>
<p>            if (isset($this-&gt;_extends[$type])) {<br />
                $__ctl_out = call_user_func_array($render,<br />
                        array('name' =&gt; $name, 'attribs' =&gt; $attribs));<br />
            }<br />
        }</p>
<p>        if ($__ctl_out === false) {<br />
            $__ctl_out = "INVALID CONTROL TYPE \"{$type}\"";<br />
        }</p>
<p>        if ($return) { return $__ctl_out; }<br />
        echo $__ctl_out;<br />
        return '';<br />
    }</p>
<p>实例化控件之后，在模版（也就是 .php）中：</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #008080;">1</span> <span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br />
</span><span style="color: #008080;">2</span> <span style="color: #000000;"> </span><span style="color: #800080;">$ui</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">control(</span><span style="color: #000000;">'</span><span style="color: #000000;">textbox</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">username</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">3</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">array</span><span style="color: #000000;">(<br />
</span><span style="color: #008080;">4</span> <span style="color: #000000;">        </span><span style="color: #000000;">'</span><span style="color: #000000;">class</span><span style="color: #000000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">textbox</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">5</span> <span style="color: #000000;">        </span><span style="color: #000000;">'</span><span style="color: #000000;">size</span><span style="color: #000000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">28</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">6</span> <span style="color: #000000;">        </span><span style="color: #000000;">'</span><span style="color: #000000;">maxlength</span><span style="color: #000000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">22</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">7</span> <span style="color: #000000;">    )<br />
</span><span style="color: #008080;">8</span> <span style="color: #000000;">);<br />
</span><span style="color: #008080;">9</span> <span style="color: #000000;">?&gt;</span></div>
<p>如果使用smarty，调用方式就是:</p>
<p>{ webcontrol type='textbox' value=$textbox_value }<br />
系统会自动去实例化控件对象</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-131.html/feed</wfw:commentRss>
		<slash:comments>318</slash:comments>
		</item>
		<item>
		<title>Fleaphp 关闭日志服务</title>
		<link>http://www.zui88.com/blog/view-44.html</link>
		<comments>http://www.zui88.com/blog/view-44.html#comments</comments>
		<pubDate>Sat, 13 Aug 2011 04:44:18 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[fleaphp]]></category>
		<category><![CDATA[日志服务]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=44</guid>
		<description><![CDATA[fleaphp框架日志服务开启的时候回产生大量的日志文件，对于大部分寸土寸金的虚拟空间来说是个不小的压力，只要重新定义一下'logEnabled'这个配置参数，改为false就可以关闭了]]></description>
			<content:encoded><![CDATA[<p>fleaphp框架日志服务开启的时候回产生大量的日志文件，对于大部分寸土寸金的虚拟空间来说是个不小的压力，只要重新定义一下'logEnabled'这个配置参数，改为false就可以关闭了</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-44.html/feed</wfw:commentRss>
		<slash:comments>406</slash:comments>
		</item>
		<item>
		<title>Fleaphp访问出错返回404页面的方法</title>
		<link>http://www.zui88.com/blog/view-33.html</link>
		<comments>http://www.zui88.com/blog/view-33.html#comments</comments>
		<pubDate>Sun, 07 Aug 2011 08:29:00 +0000</pubDate>
		<dc:creator>lin</dc:creator>
				<category><![CDATA[后端程序]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[fleaphp]]></category>

		<guid isPermaLink="false">http://www.zui88.com/blog/?p=33</guid>
		<description><![CDATA[配置文件里有项 ： 'dispatcherFailedCallback' , 他用来设置当调度器失败时调用的方法。 应用很灵活， 举个例子， 当控制器或控制器动作不存在就跳到定制的404页面。 FLEA::setAppInf('dispatcherFailedCallback', 'onDispatcherFailed'); function onDispatcherFailed { redirect('404.html'); } &#160; dispatcherFailedCallback的配置分2种情况，如果当前访问的控制器、动作不存：'dispatcherFailedCallback' =&#62; 'onDispatcherFailedCallback', 如果用户设置了RABC访问控制，访问无法访问的动作时：'dispatcherAuthFailedCallback' =&#62; 'onAuthFailedCallback', 上面onDispatcherFailedCallback、onAuthFailedCallback是出错的时候调用的函数，你可以在index.php种定义这2个函数就OK了。 例如： function onAuthFailedCallback($controller,$action) { redirect(url('Login','Index')); // 这里是验证失败时，让用户去登录 }]]></description>
			<content:encoded><![CDATA[<p>配置文件里有项 ： 'dispatcherFailedCallback' ,  他用来设置当调度器失败时调用的方法。<br />
应用很灵活， 举个例子， 当控制器或控制器动作不存在就跳到定制的404页面。</p>
<blockquote><p>FLEA::setAppInf('dispatcherFailedCallback', 'onDispatcherFailed');</p>
<p>function onDispatcherFailed</p>
<p>{</p>
<p>redirect('404.html');</p>
<p>}</p>
<p>&nbsp;</p>
<p>dispatcherFailedCallback的配置分2种情况，如果当前访问的控制器、动作不存：'dispatcherFailedCallback'  =&gt; 'onDispatcherFailedCallback',<br />
如果用户设置了RABC访问控制，访问无法访问的动作时：'dispatcherAuthFailedCallback' =&gt; 'onAuthFailedCallback',<br />
上面onDispatcherFailedCallback、onAuthFailedCallback是出错的时候调用的函数，你可以在index.php种定义这2个函数就OK了。<br />
例如：<br />
function onAuthFailedCallback($controller,$action)<br />
{</p>
<p>redirect(url('Login','Index'));   //   这里是验证失败时，让用户去登录<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.zui88.com/blog/view-33.html/feed</wfw:commentRss>
		<slash:comments>414</slash:comments>
		</item>
	</channel>
</rss>
