【问题标题】:CakePHP Pull data from two tablesCakePHP 从两个表中拉取数据
【发布时间】:2011-07-16 11:31:52
【问题描述】:

我的应用中有两个表格:“客户”和“约会”

在约会表中,我有一个名为“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';
}

Edit2:查看

    <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>

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    您需要在Client->Appointment 模型之间设置hasMany 关联(参见docs,与User->Comment 关联完全一样),并在@987654329 之间反向belongsTo 关联@->Client(参见同一个文档)。

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

    class Client extends AppModel
    {
        var $hasMany = 'Appointment';
    }
    
    class Appointment extends AppModel
    {
        var $belongsTo = 'Client';
    }
    

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

    【讨论】:

    • 适用于哪个型号?
    • Client 进入 Client 模型,Appointment 进入 Appointment 模型。
    • 好的,那么我将如何显示我正在查看的客户的约会?我会在控制器中为admin_view 方法添加什么?谢谢
    • 您当前的代码可以正常工作。您只需要更改您的模型(这样查询 Client 模型就像您现在一样会连接到 Appointment 模型)。
    • 我将在上面发布我当前的观点。我将如何为该客户安排约会,例如/clients/view/201
    【解决方案2】:

    您应该将外键命名为“client_id”。这样,当你烘烤它时,Cake 可以自动建立连接。 另外,就您当前的目的而言, recursive=1 就可以了。但我建议调查 Containable。这是一个非常有用的工具。

    【讨论】:

      【解决方案3】:

      确保在您的模型中,两个模型都设置了关联变量。即在客户端模型中,有一个带有外键 client_id 的 hasMany 关联集,而在 Appointment 模型中,有带有外键 client_id 的 belongsTo。如果这没问题,请检查您是否在控制器中调用 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));
      

      【讨论】:

      • 嗨。那只是我的头。您能否展示一个示例,说明这在代码方面的外观。我将在上面发布我的模型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多