在视图中使用模型中的函数

时间:2013-11-26 10:27:25

标签: php cakephp cakephp-appmodel

在CakePHP中,我有一个模型Customer,如下所示:

<?php

class Customer extends AppModel {
    public $hasMany = array(
        'Invoice' => array(
            'className' => 'Invoice',
        )
    );

    public function getDisplayName($id){
        $customer = new Customer(); 
        $customer_array = $customer->find('first', array(
            'conditions' => array('Customer.id' => $id)
        ));

        if($customer_array['Customer']['company']){
            return $customer_array['Customer']['company'];
        } else {
            return $customer_array['Customer']['frontname'] . ' ' . $customer_array['Customer']['lastname'];
        }
    }

    public function getFullName($id){
        $customer = new Customer(); 
        $customer_array = $customer->find('first', array(
            'conditions' => array('Customer.id' => $id)
        ));

        return $customer_array['Customer']['frontname'] . ' ' . $customer_array['Customer']['lastname'];
    }

}
?>

在另一个视图(项目)中,我想显示一个显示名称的客户列表(因为其中一些客户有公司而有些公司没有)。

所以在ProjectController中我添加了这个:

$customers = $this->Project->Customer->find('list', array(
    'fields' =>array(
        'Customer.id', $this->Project->Customer->getDisplayName('Customer.id')
    ),
    'conditions' => array(
        'Customer.cloud_id' => '1'
    )
));             
$this->set('customers', $customers);

但后来我收到MySQL错误,因为第二个字段不是数据库列。

谁可以帮我解决这个问题?

2 个答案:

答案 0 :(得分:1)

您最好的方法是在客户模型中使用虚拟字段: 请参阅文档:http://book.cakephp.org/2.0/en/models/virtual-fields.html

<?php
class Customer extends AppModel {
    public $hasMany = array(
        'Invoice' => array(
            'className' => 'Invoice',
        )
    );
    public $virtualFields = array(
        'display_name' => 'IF(Customer.company IS NOT NULL, Customer.company, CONCAT_WS(' ', Customer.frontname, Customer.lastname))'
    );
}
?>

然后在项目控制器中:

<?php
$customers = $this->Project->Customer->find('list', array(
    'fields' =>array(
        'Customer.id', 'Customer.display_name'
    ),
    'conditions' => array(
        'Customer.cloud_id' => '1'
    )
));             
$this->set('customers', $customers);
?>

答案 1 :(得分:0)

为了更一般地回答这个问题(这里虚拟字段解决方案工作正常),您可以重写getDisplayName函数并将其放入Controller中。

然后你可以使用

从视图中调用它
$displayName= $this->requestAction(array(
  'controller'=>'CustomersController',
  'action'=>'getDisplayName ')
);

echo $displayName;