mysql - fields - findby cake php
MĂșltiples relaciones con el mismo modelo CakePHP (1)
Hola, tenemos tres tablas en nuestra base de datos que están conectadas a través de dos relaciones que son Cuenta y Facturas.
Cuentas (id ....) Facturas (id, sender_id, receiver_id) Relaciones (id, sender_id, receiver_id)
El remitente y el receptor son claves externas que hacen referencia a la tabla de cuentas, por lo que en cakePHP es un account_id. La tabla de relaciones especifica las relaciones donde las facturas se pueden enviar o recibir y la tabla de facturas muestra las facturas que se han enviado.
¿Cómo vinculamos estas dos claves foráneas con Cuentas en CakePHP?
Cake encuentra que hay una relación y enumera los receptores disponibles para enviar una factura. En este momento está enviando el sender_id correcto a la base de datos, pero enviando el relationship_id a la base de datos como el receiver_id en la tabla de facturas.
Ya pasó por esto pero no funciona: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm
Esto es lo que tenemos para nuestros dos modelos:
Modelo de cuenta:
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'',
)
);
}
Modelo de factura:
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'';
Controlador de facturas:
$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);
Agregar vista:
<?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'');
?>
No creo que necesite una tabla de combinación para facturas y remitentes y receptores. Puede almacenar estas claves foráneas en su tabla de facturas. Sus relaciones serían entonces:
<?php
class Invoice extends AppModel {
public $belongsTo = array(
''Sender'' => array(
''className'' => ''Account'',
''foreignKey'' => ''sender_id''
),
''Receiver'' => array(
''className'' => ''Account'',
''foreignKey'' => ''receiver_id''
)
);
}
Si luego necesita distinguir facturas enviadas o no, también puede agregar una columna llamada status_id
o similar, y almacenar otra clave externa en una nueva tabla de statuses
, con una columna de ID y columna de nombre, y los siguientes datos de muestra:
id name
== ====
1 Draft
2 Sent
Y cualquier otro estado que pueda necesitar.