我想知道是否有任何方法可以在CakePHP中声明一个虚拟字段来执行以下操作:我们必须用符号替换用户的状态,并在其上附加用户的昵称。例如,如果用户是管理员,我们希望显示:@barth
,对于常规用户~barth
。
我已经编写了一个afterFind()
回调来执行此任务,但它使用containable
行为失败了。
要么有其他方法来实现它,要么我们可以创建一个虚拟字段。后一种解决方案将非常优雅,但在谷歌搜索后,我找不到任何方法使用MySQL语法将一个字符串替换为另一个字符串。
想法?
虚拟字段在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不允许在创建新的虚拟字段时使用关联模型的虚拟字段,但您可以执行子选择查询来手动获取这些数据。下面是一个SQL Fiddle示例。