连接表CakePHP belongsTo,hasMany

时间:2010-11-23 23:03:51

标签: cakephp foreach join

Tl; Dr:如何创建一个数组;从两张桌子;与hasMany和belongsTo关联;通过;与CakePHP;最佳。

编辑:来自(http://book.cakephp.org/view/872/Joining-tables)这就是我正在努力学习如何做,虽然它说“hasOne”而不是hasMany ....

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

我正在尝试通过一个数组进行操作,该数组理想地包含来自两个具有hasMany和belongsTo关系的表的数据。我知道CakePHP内置了一些功能,使其非常简单并且想要使用它:

  1. 旅行有很多腿
  2. 双腿属于旅行
  3. 所以,我想创建一个包含两个表中数据的数组,这样我就可以在视图中轻松显示数据。请注意,没有关于加入包含查找参数的数组的信息。我认为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;?>
    

    再次感谢!

1 个答案:

答案 0 :(得分:1)

如果Trip有很多腿,你应该可以像这样遍历数据:

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

debug($trips)是你的朋友。默认的Cake数据数组布局非常合理。尝试习惯它,应该很少需要在99.99%的应用程序中修改结构。相反,在所有地方保持一致是有充分理由的。