cakephp模型virtualFields无法通过包含

时间:2013-02-27 21:11:52

标签: cakephp cakephp-1.3 php

我有一个名为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与我的模型belongsToMyOtherModel的关系

上面的查询给出了以下错误:

  

警告(512):SQL错误:1054:'on子句'中的未知列'User.full_name'[CORE \ cake \ libs \ model \ datasources \ dbo_source.php,第681行]

有关我如何能做到这一点的任何帮助吗?谢谢

2 个答案:

答案 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.'%"');