我有一个控制器用于发票,另一个用于客户。
我在这些控制器的模型中建立了一些“关系”,如下所示:
Client.php
<?php
class Client extends AppModel {
public $hasMany = array(
'Invoice' => array(
'className' => 'Invoice',
'foreignKey' => 'client_id'
)
);
}
?>
Invoice.php
<?php
class Invoice extends AppModel {
public $belongsTo = array(
'Client' => array(
'className' => 'Client',
'foreignKey' => 'client_id'
)
);
}
?>
所以我认为与每个客户进行下拉很容易。虽然,我无法弄清楚如何做到这一点。
首先,这就是我想要的结果:
<select>
<option value="1">Client Name</option>
</select>
其中value等于客户端表中的id,Client Name等于client表中的name。
我尝试将以下内容放入发票控制者:
$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
直接在页面加载。我需要做些什么来完成这项工作?
答案 0 :(得分:4)
很可能,您的问题是客户端模型未自动加载到Invoices控制器中。由于客户与发票有关系,因此您可以在客户端上调用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而不是客户名称。