1

我有一个控制器用于发票,另一个控制器用于客户。

我在这些控制器的模型中做了一些“关系”,如下所示:

客户端.php

<?php

  class Client extends AppModel {
      public $hasMany = array(
          'Invoice' => array(
              'className' => 'Invoice',
              'foreignKey' => 'client_id'
           )
      );
   }

?>

发票.php

<?php

class Invoice extends AppModel {
    public $belongsTo = array(
        'Client' => array(
            'className' => 'Client',
            'foreignKey' => 'client_id'
        )
    );
}

?>

所以我认为与每个客户进行下拉会很容易。虽然,我无法弄清楚如何做到这一点。

首先这是我想要的结果:

<select>
  <option value="1">Client Name</option>
</select>

其中值等于客户端表中的 id,客户端名称等于客户端表中的名称。

我尝试将以下内容放入发票控制器中:

$client = $this->Client->find('all');

然后我认为以下内容:

echo $this->Form->select('client_name',client, array(
                'class' => 'form-control',
                'name' => 'client_id'
            ));

但我收到以下错误:

Call to a member function find() on a non-object    

直接在页面加载。我需要做什么才能完成这项工作?

4

1 回答 1

4

您的问题很可能是 Invoices 控制器中没有自动加载 Client 模型。由于 Client 与 Invoice 有关系,因此您可以像这样在 Client 上调用 find :

$data = $this->Invoice->Client->find('list', array('fields' => array('id', 'name')));
$this->set('clients', $data);

然后在视图中,

echo $this->Form->select('Invoice.client_id', $clients);

或者

echo $this->Form->input('Invoice.client_id', array('type' => 'select', 'options' => $clients));

这应该输出一个下拉列表,其中值是客户端 ID,下拉列表中的可见选项是客户端名称。在将发票与客户关联时,您将希望使用 id 而不是客户名称。

于 2013-11-05T20:36:48.130 回答