CakePHP从两个表中提取数据

时间:2011-07-16 11:31:52

标签: php cakephp

我的应用中有两张桌子:'客户'和'约会'

在约会表中,我有一个名为'clientid'的外键,它将表链接在一起。如何显示该用户的约会?

例如,在查看客户端/admin/clients/view/201/时,我会看到客户端201的客户端详细信息以及该客户端的约会。

到目前为止,我的控制器看起来像这样:

class ClientsController extends AppController
{
    var $name = 'Clients';

    function beforeFilter()
    {
        parent::beforeFilter();
        $this->Auth->allow(array('*'));  
    }

    function admin_view($id = null)
        {
            $this->Client->id = $id;
            $this->set('client', $this->Client->read());
        }

非常感谢任何帮助。感谢

编辑:客户端模型

class Client extends AppModel
{
    var $name = 'Client';

    var $useTable = 'clients';
}

编辑2:查看

    <h1><?php echo $client['Client']['lastname']; ?> <?php echo $client['Client']['firstname']; ?> (<?php echo $this->Html->link('Edit', array('action' => 'edit', $client['Client']['id'])); ?>)</h1>

    <p><strong>Date of Birth:</strong> <?php echo $client['Client']['dateofbirth']; ?></p>

    <h3>Appointments</h3>

<table>
    <?php foreach ($appointments as $appointment): ?>
        <tr>
            <td>
                <?php echo $this->Html->link($appointment['Appointment']['date'],
                array('admin' => true, 'controller' => 'appointment', 'action' => 'view', $appointment['Appointment']['id'])); ?>
            </td>
        </tr>
    <?php endforeach; ?>
</table>

3 个答案:

答案 0 :(得分:0)

确保在模型中两个模型都设置了关联变量。即在客户端模型中,有一个hasMany关联集与外键client_id,在约会模型中有belongsTo与外键client_id。如果这没关系,请检查控制器中是否正在调用find,并将递归设置为大于-1。

    $this->Client->find('all', 'recursive' => 1);

现在,在您的客户模型中,您应该有一个$ hasMany字段,如下面的

    var $hasMany = array(
    'Appointment' => array(
        'className' => 'Appointment',
        'foreignKey' => 'client_id',
        'dependent' => false,
        'conditions' => ''
    )

在控制器的操作中,您需要提取所有相关数据,例如在admin_view操作中使用

    $this->set('client', $this->Client->find('first', 'recursive' => 1));

答案 1 :(得分:0)

您需要在hasMany - &gt; Client模型之间设置Appointment关联(请参阅docs,与User完全相同 - &gt; {{1}关联是)和Comment - &gt; belongsTo之间的反向Appointment关联(参见相同的文档)。

如果您的数据库表和密钥是根据Cake conventions命名的,并且您使用的是PHP 5,那么这就是您所需要的:

Client

默认情况下,递归设置为1(如您所需),所以如果您没有在任何地方更改它 - 您的代码应该可以正常工作。

答案 2 :(得分:0)

您应该将外键命名为“client_id”。这样当你烘焙它时,Cake可以自动建立连接。 此外,对于您当前的目的,recursive = 1也没关系。但我建议考虑包含在内。这是一个非常有用的工具。