题
我想发现(全部)接收模型数据,但用户应该只得到有限的一组表中的字段。这很简单:
$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雇员?