使用cakephp进行下拉选择的数据库表

使用cakephp进行下拉选择的数据库表,php,cakephp,Php,Cakephp,我有一个发票控制器和另一个客户控制器 我在这些控制器的模型中建立了一些“关系”,如下所示: Client.php <?php class Client extends AppModel { public $hasMany = array( 'Invoice' => array( 'className' => 'Invoice', 'foreignKey' => 'client_i

我有一个发票控制器和另一个客户控制器

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

Client.php

<?php

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

?>
<?php

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

?>
我的观点是:

echo $this->Form->select('client_name',client, array(
                'class' => 'form-control',
                'name' => 'client_id'
            ));
但我收到了以下错误:

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

直接在页面加载。我需要做什么才能使这项工作正常进行?

很可能,您的问题是客户机模型没有自动加载到发票控制器中。由于客户机与发票有关系,您可以像这样在客户机上调用find:

$data = $this->Invoice->Client->find('list', array('fields' => array('id', 'name')));
$this->set('clients', $data);
那么在我们看来,

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


这将输出一个下拉列表,其中值是客户端id,下拉列表中的可见选项是客户端名称。在将发票与客户机关联时,您需要按id而不是客户机名称进行操作。

更可能的问题是,客户机模型没有自动加载到发票控制器中。由于客户机与发票有关系,您可以像这样在客户机上调用find:

$data = $this->Invoice->Client->find('list', array('fields' => array('id', 'name')));
$this->set('clients', $data);
那么在我们看来,

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


这将输出一个下拉列表,其中值是客户端id,下拉列表中的可见选项是客户端名称。在将发票与客户关联时,您需要按id而不是客户名称进行操作。

您的问题很可能是客户机模型没有自动加载到发票控制器中。由于客户机与发票有关系,您可以像这样在客户机上调用find:
$this->Invoice->Client->find('all')。您可能还想使用“查找”类型“列表”,该类型将返回格式化的结果,您可以使用该格式轻松创建选择选项。@Kai,首先为延迟响应感到抱歉,最后尝试了您的解决方案,几乎成功了。所以你能把这个放在答案里吗。最后,在我的视图中,客户端是一个未定义的变量。猜我需要在视图中定义变量吗?我目前有:
$client=$this->Invoice->client->find('list')
在我的控制器中,然后:
echo$this->Form->select('client\u name',$client,array(
(当然缩短了)在我看来,您的问题很可能是客户机模型没有自动加载到发票控制器中。由于客户机与发票有关系,您可以像这样在客户机上调用find:
$this->Invoice->Client->find('all');
。您可能还想使用“查找”类型列表,它将返回格式化的结果,您可以使用这种方式轻松创建选择选项。@Kai,首先对延迟响应感到抱歉,最后尝试了您的解决方案,几乎成功了。因此,您可以将此放在答案中。最后,我将客户作为联合国会员在我的视图中定义了变量。猜测我需要以某种方式在视图中定义变量吗?我当前在我的控制器中有:
$client=$this->Invoice->client->find('list');
,然后在我的视图中:
echo$this->Form->select('client_name',$client,array)(
(当然简称))。
echo $this->Form->input('Invoice.client_id', array('type' => 'select', 'options' => $clients));