我想发现(全部)接收模型数据,但用户应该只得到有限的一组表中的字段。这很简单:

$ret = $this->find('all',array('fields'=>array(
    'Employee.id','Employee.address_id'
)));

但这种模式(雇员模型)也有一个属于关联关联:

var $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'address_id',
        'fields' => array('Address.full_name')
    )
);

我想Address.full_name实地出现在我取得的数据了。但它不工作与上面的find()方法调用,它抛出一个错误(SQL错误:1054:未知列“Address.full_name”在“字段列表”)尝试这种时候:

'fields'=>array('Employee.id','Employee.address_id','Address.full_name')

任何人知道如何解决这个问题?

修改我完全忘记了Address.full_name是一个虚拟场。纵观CakePHP的生产SQL,这是显而易见的,为什么它不工作:

SELECT
    `Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
FROM
    `employees` AS `Employee`
    LEFT JOIN `addresses` AS `Address`
        ON (`Employee`.`address_id` = `Address`.`id`)
WHERE 1 = 1

在地址模型,FULL_NAME的定义如下:

var $virtualFields = array(
    'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)'
);

那么,问题是:它是一个CakePHP的错误,它并不能够包括(国外型号的)一个字段列表中的虚拟域提供给find()

有帮助吗?

解决方案

不幸的是,你不能使用虚拟域你希望的方式。从局限性title="Limitations 蛋糕文档中:

  

virtualFields的1.3的实施方案具有一些限制。首先,你不能在相关模型使用virtualFields的条件,订单或场阵列。这样做通常会导致SQL错误的领域不被ORM取代。这是因为很难估计在其相关联的模型可能被发现的深度。

它看起来像你必须使用中可容纳的行为。

其他提示

我会使用中可容纳的行为在这种情况下。

请确保您已在员工模型加载的第一个中容纳的行为:

var $actsAs = array('Containable');

然后,当你试图让你的数据,做这样的:

$params = array('fields' => array('Employee.id', 'Employee.address_id'), 
    'contain' => array('Address' => array('fields' => array('Address.full_name')));
$ret = $this->find('all', $params);

更多关于这里的中可容纳的行为: http://book.cakephp.org/view/1323 /中可容纳

  

SQL错误:1054:未知列   'Address.full_name' 在 '字段列表')

此错误给你一个线索,有什么不妥用或者您的列名的呼叫(也可能是fullname而非full_name),或者更可能的模型定义。雇员属于关联的地址,但确实地址haveOne或haveMany雇员?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top