データベースに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');
?>