3

データベースに3つのテーブルがあり、アカウントと請求書の2つの関係で接続されています。

アカウント(id ....)請求書(id、sender_id、receiver_id)関係(id、sender_id、receiver_id)

送信者と受信者はどちらもアカウントテーブルを参照する外部キーであるため、cakePHPではaccount_idです。関係テーブルは、請求書を送信または受信できる関係を指定し、請求書テーブルには、送信された請求書が表示されます。

これらの外部キーをCakePHPのアカウントにリンクするにはどうすればよいですか?

Cakeは、関係があることを検出し、請求書の送信に使用できる受信者を一覧表示しています。現時点では、正しいsender_idをデータベースに送信していますが、relationship_idをinvoiceテーブルのreceiver_idとしてデータベースに送信しています。

すでにこれを通過しましたが、機能しません:http: //book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

2つのモデルの内容は次のとおりです。

アカウントモデル:

class Account extends AppModel{

    var $name='Account';
    public $useTable = 'accounts';
    public $primaryKey = 'id';
    var $hasAndBelongsToMany = array(
        'User' =>
            array(
                'className'=>'User',
                )
            );
    var $hasMany = array(
        'Template' =>
            array(
                'className'=>'Template',
                'foreignKey'=>'account_id',     
            ),  
            'InvoiceRecieved' => array(
                'className'=>'Invoice',
                'foreignKey'=>'receiver_id',        
            ),
            'InvoiceSent' => array(
                'className'=>'Invoice',
                'foreignKey'=>'sender_id',      
            )

        );



    }

請求書モデル:

class Invoice extends AppModel{ 
    var $name='Invoice'; 
    var $hasAndBelongsToMany = array(
        'Field' =>
            array(
                'className'=>'Field',
                'joinTable'=>'fields_invoices'

                )
            );
    var $belongsTo = array(
            'Sender' => array(
            'className' => 'Account',
            'foreignKey' =>'account_id',
            ),
            'Receiver' => array(
            'className' => 'Account',
            'foreignKey' =>'receiver_id',
            )
        ); 

    public $useTable='invoices';
    public $primaryKey='id';

請求書管理者:

 $accounts2=$this->User->AccountsUser->find('list', array(
            'fields'=>array('account_id'),'conditions' => array(
            'user_id' => $this->Auth->user('id'))));

    $accounts=$this->User->Relationship->find('list', array('fields'=>array('receiver_id'),'conditions' =>  array('sender_id' => $accounts2)));

if($this->request->is('post')){
        ($this->Invoice->set($this->request->data));
        //if($this->Invoice->validates(array('fieldList'=>array('receiver_id','Invoice.relationshipExists')))){

            $this->Invoice->save($this->request->data); 
            $this->Session->setFlash('The invoice has been saved');  
      }else { 
                $this->Session->setFlash('The invoice could not be saved. Please, try again.');
             }
    //}
     $this->set('accounts', $accounts); 
     $this->set('accounts2', $accounts2); 

ビューを追加:

<?php
echo $this->Form->create('Invoice', array('action'=>'addinvoice'));
echo $this->Form->input('sender_id',array('label'=>'Sender: ', 'type' => 'select', 'options' => $accounts3));
echo $this->Form->input('receiver_id',array('label'=>'Receiver: ', 'type' => 'select', 'options' => $accounts));
echo $this->Form->end('Click here to submit Invoice');

?>
4

1 に答える 1

2

請求書、送信者、受信者の結合テーブルは必要ないと思います。これらの外部キーは、請求書テーブルに保存できます。その場合、あなたの関係は次のようになります。

<?php
class Invoice extends AppModel {

    public $belongsTo = array(
        'Sender' => array(
            'className' => 'Account',
            'foreignKey' => 'sender_id'
        ),
        'Receiver' => array(
            'className' => 'Account',
            'foreignKey' => 'receiver_id'
        )
    );
}

次に、送信された請求書と送信されていない請求書を区別する必要がある場合は、または類似の列を追加し、ID列と名前列、および次のサンプルデータを使用してstatus_id別の外部キーを新しいテーブルに格納することもできます。statuses

id name
== ====
1  Draft
2  Sent

そして、あなたが必要とするかもしれない他のステータス。

于 2012-08-07T11:48:01.007 に答える