<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[阿Tim日志]]></title> 
<link>https://atim.cn/index.php</link> 
<description><![CDATA[专业的php开发者.开发团队的带队人]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[阿Tim日志]]></copyright>
<item>
<link>https://atim.cn/post//</link>
<title><![CDATA[Cakephp如何在paginate使用unbind]]></title> 
<author>bkkkd &lt;partybase@gmail.com&gt;</author>
<category><![CDATA[开发应用]]></category>
<pubDate>Fri, 10 Oct 2008 14:50:23 +0000</pubDate> 
<guid>https://atim.cn/post//</guid> 
<description>
<![CDATA[ 
	cakephp的controller中的paginate是一个得到分页数据的函数.配合helper里的Paginator,可以很轻松的做出分页列表,排序的列表页面.<br/>但由我开始学习用cakephp时,我就有一个问题一直困扰着我.<br/><strong>Model如何解除关联(unbind)?</strong><br/>正常的情况下,只要在find之前解除(unbind)我不需的model.就可以不去搜索这些modeld关联的数据表.而且在find完以后会自动返把之前我解除的model再次关联起来.以下是常用的使用方法<br/><div class="code"><br/>//user model<br/>class User extends AppModel &#123;<br/><br/>&nbsp;&nbsp;var $name = &#039;User&#039;;<br/>&nbsp;&nbsp;var $belongsTo = array(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;Profile&#039; = array(&#039;className&#039;=&gt;&#039;Profile&#039;,&#039;foreignKey&#039;=&gt;&#039;user_id&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br/>&#125;<br/></div><br/>运行以下代码<br/><div class="code"><br/>$this-&gt;User-&gt;unbind(array(&#039;belongsTo&#039;=&gt;array(&#039;Profile&#039;)));<br/>$rs=$this-&gt;User-&gt;find();<br/></div><br/>$rs会是<br/><div class="code"><br/>array(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;User&#039;=&gt;array(),<br/>)<br/></div><br/>如果在find之前没有运行unbind,$rs将会是<br/><div class="code"><br/>array(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;User&#039;=&gt;array(),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Profile&#039;=&gt;array()<br/>)<br/></div><br/>但如果运行paginate就得不到同样的结果<br/>code]<br/>$this->User->unbind(array('belongsTo'=>array('Profile')));<br/>$rs=$this->paginate('User');<br/>[/code]<br/>$rs的结果还是<br/><div class="code"><br/>array(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;User&#039;=&gt;array(),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Profile&#039;=&gt;array()<br/>)<br/></div><br/><strong>为什么在paginate不能解除关联(unbind)?</strong><br/>原因是在find里在得到数据后,find会用model->resetAssociations();把所有关联(Association)还原.而paginate里使用了两次find.一次是得到总数,另一次得到分页显示的数据.所以返回的结果还是有Profile的内容.<br/><strong>解决方法:</strong>给unbind的第二个参数里赋上非ture的值.如果unbind的第二个参数是true,cakephp会把需要解除关联的数据库保存到model->__backAssociation里,当运行model->resetAssociations();会从model->__backAssociation把相关的关联的数据还原.所以以下代码就可以解决<br/><div class="code"><br/>$this-&gt;User-&gt;unbind(array(&#039;belongsTo&#039;=&gt;array(&#039;Profile&#039;)),false);<br/>$rs=$this-&gt;paginate(&#039;User&#039;);<br/></div><br/>另外,如果在运行paginate()后,还需要使用model里的关联数据来find 数据.可以在app_model.php文件里增加以下代码<br/><br/><div class="code"><br/>&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * function description:turn off the Association,and return the the Association,.<br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the function working for Controller-&gt;paginate() and Model-&gt;bind().<br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the function will help you that get data form Controller-&gt;paginate() before unbind some <br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Association for and rebind the remove of Association after get data.<br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if you don&#039;t neet to rebind Association,you can only use <br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;code&gt;<br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Models-&gt;unbind($params,false);<br/>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/code&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @Date:2008-10-10<br/>&nbsp;&nbsp; * &lt;code&gt;<br/>&nbsp;&nbsp; * $backAssociation = $this-&gt;ModelName-&gt;unbindAndPushModels(array(&#039;belongsTo&#039;=&gt;array(&#039;User&#039;)));<br/>&nbsp;&nbsp; * $result=$this-&gt;paginate(&#039;ModelName&#039;);<br/>&nbsp;&nbsp; * $this-&gt;ModelName-&gt;bind($backAssociation);//this action is to restore the model of assocication data.<br/>&nbsp;&nbsp; * &lt;/code<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp;&nbsp;&nbsp;(类型)参数名&nbsp;&nbsp;:描述<br/>&nbsp;&nbsp;**/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Function unbindAndPushModels($params)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$backAssociation=array();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($params as $assoc =&gt; $models)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($models as $model)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(isset($this-&gt;&#123;$assoc&#125;&#91;$model&#93;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$backAssociation&#91;$assoc&#93;&#91;$model&#93; = ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset ($this-&gt;&#123;$assoc&#125;&#91;$model&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Return $backAssociation;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/></div><br/>Tags - <a href="https://atim.cn/tags/cakephp/" rel="tag">cakephp</a>
]]>
</description>
</item><item>
<link>https://atim.cn/post//#blogcomment</link>
<title><![CDATA[[评论] Cakephp如何在paginate使用unbind]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://atim.cn/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>