read fields cake mysql cakephp associations relationships

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.