2010-06-03 96 views
2

我对CakePHP比较新,我对文档做的很好,但我一直在试图找出解决这个问题几个星期的方法,我似乎没有找到解决方案,我相信它很容易,甚至可以automagically可行,但我只是不知道如何找到它(也许我不知道这些东西的行话)CakePHP 3级深层模型协会

我的模型结构是像这:

...等等与用户,城市,国家和运输模型。

我想要实现的是在搜索Trip时获取整棵树的所有信息。

<?php 
class TripController extends AppController { 
    function index() { 
     debug($this->Trip->find('first')); 
    } 
} 

输出

Array 
(
    [Trip] => Array 
     (
      [id] => 6 
      [created] => 2010-05-04 00:23:59 
      [user_id] => 4 
      [start_id] => 2 
      [end_id] => 1 
      [title] => My trip 
      [transport_id] => 1 
     ) 

    [User] => Array 
     (
      [id] => 4 
      [name] => John Doe 
      [email] => [email protected] 
     ) 

    [Start] => Array 
     (
      [id] => 2 
      [user_id] => 4 
      [country_id] => 1 
      [state_id] => 1 
      [city_id] => 1 
      [direccion] => Lincoln Street 
     ) 

    [End] => Array 
     (
      [id] => 1 
      [user_id] => 4 
      [country_id] => 1 
      [state_id] => 1 
      [city_id] => 4 
      [address] => Fifth Avenue 
     ) 

    [Transport] => Array 
     (
      [id] => 1 
      [name] => car 
     ) 
) 

这里有一个问题: 如何在一个查询趴下树上所有的信息?

我想有像

Array 
(
    [Trip] => Array 
     (
      [id] => 6 
      [created] => 2010-05-04 00:23:59 
      [User] => Array 
       (
        [id] => 4 
        [name] => John Doe 
        [email] => [email protected] 
       ) 
      [Start] => Array 
       (
        [id] => 2 
        [user_id] => 4 
        [Country] => Array 
         (
          [id] => 1 
          [name] = Spain 
         ) 
        [State] => Array 
         (
          [id] => 1 
          [name] = Barcelona 
         ) 
        [City] => Array 
         (
          [id] => 1 
          [name] = La Floresta 
         ) 
        [address] => Lincoln Street 
       ) 
      [End] => (same as Start) 
      [title] => My trip 
      [Transport] => Array 
       (
        [id] => 1 
        [name] => car 
       ) 
     ) 
) 

灿CakePHP中创建此类型的数据? 不仅为$this->Model->find()也为$this->paginate(),例如:

// filter by start 
    if(isset($this->passedArgs['start'])) { 
     //debug('isset '.$this->passedArgs['start']); 
     $start = $this->passedArgs['start']; 
     $this->paginate['conditions'][] = array(
      'OR' => array(
       'Start.address LIKE' => "%$start%", 
       'Start.State.name LIKE' => "%$start%", 
       'Start.City.name LIKE' => "%$start%", 
       'Start.Country.name LIKE' => "%$start%" 
      ) 
     ); 
     $this->data['Search']['start'] = $start; 
    } 

这似乎是一个粗略的问题,但我相信这是广泛进行和记录,我会很感激的任何帮助。

回答

6

您似乎已将所有设置确定。所有你应该做的是设置递归为2,应该给你一个额外的级别到您的数据(假设你已经正确设置了所有的关系)

var $recursive =2; 
+1

或'$ this-> Trip-> find('first',array('recursive'=> 2));' – bancer 2010-06-03 16:15:08

+0

简单漂亮。感谢milion paullb和bancer! – 2010-06-04 09:47:40

+0

这看起来可能很棒,但是 - 有很多关联,我不能使用递归2而不会出现内存错误 - 即使我将其限制为一个结果(如'first')。有任何想法吗? – Dave 2011-06-16 16:16:33

3

的替代,更多的手术,解决方案,它如果您需要深入两层以上,或者您有很多二级关联(对于此特定问题您不需要),则此功能特别有用,这是Containable Behavior。这是1.2.x文档。如果你使用v1.3.x,你会发现它here

+0

感谢罗布。我很感激你花了时间 – 2010-06-04 09:48:15