我有一个名为User
的模型,其中Virtual field名为full_name
。当我在find()查询中访问我的模型User
时,我可以在我的虚拟字段上设置条件,没有这样的问题:
$user = $this->User->find('first', array(
'recursive' => -1,
'conditions' => array(
'User.full_name' => 'Bruce Thomas'
)
));
上面的查询将成功返回名为Bruce Thomas的用户的数据。但是当我尝试通过另一个模型使用我的模型用户时,问题出现了,如下所示:
$user = $this->MyOtherModel->find('first', array(
'contain' => array('User'),
'conditions' => array(
'MyOtherModel.id' => $my_other_model_id
'User.full_name' => 'Bruce Thomas'
)
));
(上面的示例假设MyOtherModel
与我的模型belongsTo
有MyOtherModel
的关系
上面的查询给出了以下错误:
警告(512):SQL错误:1054:'on子句'中的未知列'User.full_name'[CORE \ cake \ libs \ model \ datasources \ dbo_source.php,第681行]
有关我如何能做到这一点的任何帮助吗?谢谢
答案 0 :(得分:10)
根据最新的CakePHP文档(针对v2及更高版本),这是虚拟字段的限制 - this is what it says:
virtualFields的实现有一些限制。首先,您不能在关联模型上对条件,顺序或字段数组使用virtualField。这样做通常会导致SQL错误,因为字段不会被ORM替换。这是因为很难估计可能找到相关模型的深度。此实现问题的常见解决方法是在需要访问虚拟目标时,在运行时将虚拟目标从一个模型复制到另一个模型:
$this->virtualFields['name'] = $this->Author->virtualFields['name'];
或
$this->virtualFields += $this->Author->virtualFields;
此处有更多详细信息:http://book.cakephp.org/2.0/en/models/virtual-fields.html - 如果您计划实施他们建议的选项(对我而言看起来很不错),您应该查看“虚拟字段和模型别名”部分以避免字段名称冲突(即如果在两个模型中有一个名为full_name
的字段并尝试发出一个使用两者的查询,则会出现模糊的字段SQL错误;使用别名可以避免这种情况。)
答案 1 :(得分:1)
在您的模型中,您必须使用以下代码创建虚拟字段:
public $virtualFields = array(
'full_name' => 'CONCAT(YourModelName.first_name, " ", YourModelName.last_name)'
);
现在您只需要在控制器的条件数组中调用以下代码:
$condition=array($this->YourModelName->virtualFields['your_virtual_field_name'].' LIKE "%'.$YourSearchKeyword.'%"');