1

請求書用のコントローラーとクライアント用のコントローラーがあります。

以下のように、これらのコントローラーのモデルでいくつかの「関係」を作成しました。

クライアント.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>

値はクライアント テーブルの 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

ほとんどの場合、問題は Client モデルが Invoices コントローラーに自動的にロードされないことです。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 に答える