cakephp模型virtualFields不通过包含工作


cakephp model virtualFields not working via contain

我有一个名为User的模型,它有一个名为full_name的虚拟字段。当我在find()查询中访问我的模型User时,我可以在我的虚拟字段上设置条件,没有这样的问题:

$user = $this->User->find('first', array(
    'recursive' => -1, 
    'conditions' => array(
        'User.full_name' => 'Bruce Thomas'
    )
));

上面的查询将成功地返回用户Bruce Thomas的数据。但是,当我试图通过Containable行为通过另一个模型使用我的模型User时,问题就出现了,像这样:

$user = $this->MyOtherModel->find('first', array(
    'contain' => array('User'),
    'conditions' => array(
        'MyOtherModel.id' => $my_other_model_id
        'User.full_name' => 'Bruce Thomas'
    )
));

(上面的示例假设MyOtherModel与我的模型MyOtherModel具有belongsTo关系)

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

Warning (512): SQL Error: 1054: Unknown column 'User. 'full_name' in 'on子句' [CORE'cake'libs'model'datasources'dbo_source.php, line 681]

请告诉我怎么做这个好吗?谢谢你

根据最新的CakePHP文档(对于v2及更高版本),这是虚拟字段的限制-它是这样说的:

virtualFields的实现有一些限制。首先,您不能在条件、订单或字段数组的相关模型上使用virtualFields。这样做通常会导致SQL错误,因为字段没有被ORM替换。这是因为很难估计可能找到相关模型的深度。解决这个实现问题的一个常见方法是,在运行时需要访问virtualFields时,将它们从一个模型复制到另一个模型:

$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错误;

在您的模型中,您必须使用下面的代码创建虚拟字段:

public $virtualFields = array(
    'full_name' => 'CONCAT(YourModelName.first_name, " ", YourModelName.last_name)'

);现在你只需要在控制器的条件数组中调用下面的代码:

$condition=array($this->YourModelName->virtualFields['your_virtual_field_name'].' LIKE "%'.$YourSearchKeyword.'%"');