 <p>Look at the SQL debug output, the regions are being retrieved using separate queries, that's how Cakes ORM currently works.</p> <p>In your case there's a relatively simple workaround. Just <a href="http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#creating-and-destroying-associations-on-the-fly">create a proper association on the fly</a>, for example <code>Profile belongsTo Region</code>.</p> <p>Here's an (untested) example, it adds a <code>belongsTo</code> association with the <code>foreignKey</code> option set to <code>false</code> in order to disable the automatic foreign key generation by the ORM, this is necessary as it would otherwise look for something like <code>Profile.region_id</code>. Note that consequently the <code>contain</code> config has to be changed too!</p> <pre><code>$this-&gt;Profile-&gt;bindModel(array( 'belongsTo' =&gt; array( 'Region' =&gt; array( 'foreignKey' =&gt; false, 'conditions' =&gt; array('Region.id = Store.region_id') ), ) )); $this-&gt;Paginator-&gt;settings = array( 'conditions' =&gt; array('Profile.job_title_id' =&gt; '1'), 'contain' =&gt; array('Store', 'Region') ); </code></pre> <p>That should generate a proper query that includes the <code>stores</code> as well as the <code>regions</code> table, making it possible to sort on <code>Region.name</code>. Note that the resulting array will be a little different, <code>Region</code> will not be nested in <code>Store</code>, everything will be placed in the same level, ie:</p> <pre><code>Array ( [Profile] =&gt; Array ( .... ) [Store] =&gt; Array ( .... ) [Region] =&gt; Array ( .... ) ) </code></pre> <p>Either you modify your view code accordingly, or you transform the retrieved data before passing it to the view. A third option would be to include a nested <code>Region</code> in the <code>contain</code> config, however that would result in additional queries that are totally unnecessary as the data was already fetched with the main query, so I wouldn't recommend that.</p>