2010-11-23 60 views
0

Tl; Dr:如何创建一个数组;来自两张桌子;与hasMany和belongsTo联合;通过;与CakePHP;最佳。加入表CakePHP belongsTo,hasMany

编辑:从(http://book.cakephp.org/view/872/Joining-tables)这是我试图学习如何做,虽然它说“hasOne”,而不是hasMany ...

“在CakePHP中,一些关联(belongsTo和hasOne)执行自动连接来检索数据,因此您可以根据相关数据中的数据发出查询来检索模型。”

我试图通过一个数组,将理想地包含来自两个表具有hasMany和belongsTo关系的数据。我知道,CakePHP有功能内置的以使这个非常简单的,想使用它:

  1. 游的hasMany腿
  2. 腿属于关联车次

所以,我想使包含数组来自两个表的数据,以便我可以轻松地在视图中显示数据。请注意,加入包含查找参数的数组中没有任何内容。我认为CakePHP在创建关联时加入表格;我只是不确定如何在创建数组时访问这些关联。

(我已经花了几个小时了,找不到如何在网上或书本上做的例子,所以感谢您的帮助)。我可以解决这个问题(通过创建一个单独的数组并且有一个更复杂的视图文件),但我刚开始学习编程,并希望在某种程度上做到最佳并使用CakePHP的功能。

在此先感谢您的帮助!我不正确的是,通过这些关联(belongsTo和hasMany),我不必在controller/find()中显式声明连接?现在,我可能会尝试手动让连接看看会发生什么。

现有代码(这工作正常):

trips_controllers:

function view() { 
    if(empty($this->data)){ 
     $this->Session->setFlash('You forgot to put stuff in the form fields!'); 
     $this->redirect(array('action'=>'index')); 
    } 
    $price=$this->data['Trip']['price']; 
    $origin=$this->data['Trip']['origin_airport']; 
    $this->set('trips', $this->Trip->find('all', array('conditions'=>array('Trip.price <='=>$price, 'Trip.origin_airport'=>$origin), 'limit'=>30, 'recursive=>2'))); 

观点:

再次
<th>Trip ID</th> 
      <th>Price</th> 
      <th>Origin</th 
      </tr> 
      <? foreach($trips as $trip):?> 
      <tr> 
       <td><?=$trip['Trip']['trip_id'];?></td> 
       <td><?=$html->link($trip['Trip']['url']);  ?> 
       <td><?=$trip['Trip']['origin_airport'];?></td> 
       <td><?=$trip['Trip']['price'];?></td>    
       </tr> 
       <? endforeach;?> 

谢谢!

+0

您能澄清一下当前``trip`数组中你从标准的`find`调用中遇到什么问题,以及为什么你不能按照你想要的方式循环? – deceze 2010-11-23 23:43:03

+0

Thanks Deceze。您的评论让我觉得他们现在应该可以访问了。如果第二个表的数据在那里,那么我将如何在foreach中访问它们?当我等待您的回复时,我会尝试$ trip ['2ndtablename'] ['fieldname']。 – JohnAllen 2010-11-24 00:12:41

回答

1

如果旅行的hasMany腿,你应该能够遍历像这样的数据:

foreach ($trips as $trip) { 
    echo $trip['Trip']['id']; 
    … 
    foreach ($trip['Leg'] as $leg) { 
     echo $leg['id']; 
     … 
    } 
} 

debug($trips)是你的朋友。默认的Cake数据数组布局非常明智。尽量习惯它,应用程序很少需要在99.99%的应用程序中修改结构。相反,要保持它在任何地方都是一致的,这是一个很好的例子。