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: выполните ваш код, это приведет к получению данных.

Надеюсь, это решит вашу проблему.

Другие вопросы по тегам