CakePHP - связанные значения не отображаются
Я занят проектом счета в CakePHP. Я установил свои связанные таблицы в моделях, но почему-то он не пересылается в представление.
Это мои модели:
Модель счета
class Invoice extends AppModel {
public $hasOne = array(
'Customer' => array(
'className' => 'Customer',
'foreignKey' => 'id'
),
'Project' => array(
'className' => 'Project',
'foreignKey' => 'id'
),
);
...
Модель проекта
class Project extends AppModel {
public $hasOne = array(
'Customer' => array(
'className' => 'Customer',
'foreignKey' => 'id'
)
);
public $hasMany = array(
'Invoice' => array(
'className' => 'Invoice',
'foreignKey' => 'project_id'
),
);
Модель клиента
class Customer extends AppModel {
public $virtualFields = array(
'full_name' => 'CONCAT(Customer.frontname, " ", Customer.lastname)',
'display_name' => 'IF(Customer.company > " ", Customer.company, CONCAT(Customer.frontname, " ", Customer.lastname))',
);
public $hasMany = array(
'Project' => array(
'className' => 'Project',
'foreignKey' => 'customer_id',
),
'Invoice' => array(
'className' => 'Invoice',
'foreignKey' => 'customer_id',
),
);
И мнение:
<?php
foreach($invoices as $invoice){
?>
<td><?php echo $invoice['Customer']['display_name']; ?></td>
<td><?php echo $invoice['Project']['project_name']; ?></td>
Вот мой контроллер:
<?php
class InvoicesController extends AppController {
public $helpers = array('Status');
public function index() {
$uid = $this->Auth->user('cloud_id');
$this->set('uid', $uid);
$allInvoices = $this->Invoice->find('all', array(
'conditions' => array(
'Invoice.cloud_id' => $this->Auth->user('cloud_id'),
)
)
);
$this->set('invoices', $allInvoices);
}
Если я распечатываю Счет-фактуру, я вижу связанные поля, но значения пусты. Вот так:
Array
(
[Invoice] => Array
(
[id] => 143
[cloud_id] => 1
[invoice_number] => 143
[customer_id] => 2
[date] => 2013-08-17
[period] => 30
[project_id] => 1
[status] => 1
[notes] =>
[secret] => df56cd45ea7cb086458cc5c3480f77c386647a86
)
[Customer] => Array
(
[id] =>
[cloud_id] =>
[company] =>
[frontname] =>
[lastname] =>
[address] =>
Но если я изменяю внешние ключи в моделях, я получаю сообщение об ошибке, что столбец не существует.
Что здесь не так?
Заранее спасибо.
2 ответа
Вместо HasOne
Ассоциация пытается использовать BelongsTo
,
class Invoice extends AppModel {
public $belongsTo = array(
'Customer' => array(
'className' => 'Customer',
'foreignKey' => 'customer_id'
),
);
Не связывайте свои таблицы, как вы делаете в приведенном выше коде! Эти отношения не являются правильными и могут быть трудными для понимания.
Вот одно решение
Шаг 1: создайте одну функцию в модели Invoice, скажем, getData()
Шаг 2: внутри этой функции напишите ниже код с небольшими правками, как в массиве fields...
$options = array(
'conditions' => array('Invoice.cloud_id' => $this->Auth->user('cloud_id')),
'joins' => array(
array(
'alias' => 'Customer',
'table' => 'customers',
'type' => 'LEFT',
'conditions' => array(
'Customer.id = Invoice.id',
),
),
array(
'alias' => 'Project',
'table' => 'projects',
'type' => 'LEFT',
'conditions' => array(
'Project.id = Invoice.id',
),
)
),
'fields' => array('PUT DESIRED FIELDS COMMA SEPERATED')
);
$returnData = $this->find('all',$options);
Шаг 3: выполните ваш код, это приведет к получению данных.
Надеюсь, это решит вашу проблему.