CakePHP虚拟字段:将一个字符串替换为另一个字符串

时间:2014-09-06 20:12:52

标签: mysql cakephp

我想知道是否有任何方法可以在CakePHP中声明一个虚拟字段来执行以下操作: 我们必须用符号替换用户的状态,并在其后附加用户的昵称。例如,如果用户是管理员,我们希望为常规用户@barth显示:~barth

我已经编写了一个afterFind()回调来执行此任务,但它无法使用containable行为。

要么有另一种方法来实现它,要么我们可以创建一个虚拟字段。后一种解决方案非常优雅,但在谷歌搜索后,我找不到任何方法使用MySQL语法将一个字符串替换为另一个字符串。

想法?

1 个答案:

答案 0 :(得分:1)

Virtual fields在Cake中非常容易使用。您可以在其声明中使用任何常规MySQL函数来实现此类事情。

首先需要确定SQL命令以实现您想要的功能,我建议使用CONCAT()函数:

-- Return an @ concatenated onto the username
CONCAT('@', yourfield)

然后将其添加为模型中的虚拟字段:

class YourModel extends AppModel {
    public $virtualFields = array(
        'yourVirtualField' => 'CONCAT("@", yourfield)'
    );
}

现在,当您查询此模型时,您应该可以像这样访问它:

$example = $this->YourModel->find('first');
echo $example['YourModel']['yourVirtualField']; // @yourfield

修改

自更新以来,您已经将要在另一个模型中连接在一起的值作为虚拟字段。 CakePHP doesn't allow you to use associated models' virtual fields when creating a new virtual field,但您可以执行子选择查询以手动获取此数据。 Here's an SQL Fiddle example.