我想知道是否有任何方法可以在CakePHP中声明一个虚拟字段来执行以下操作:
我们必须用符号替换用户的状态,并在其后附加用户的昵称。例如,如果用户是管理员,我们希望为常规用户@barth
显示:~barth
。
我已经编写了一个afterFind()
回调来执行此任务,但它无法使用containable
行为。
要么有另一种方法来实现它,要么我们可以创建一个虚拟字段。后一种解决方案非常优雅,但在谷歌搜索后,我找不到任何方法使用MySQL语法将一个字符串替换为另一个字符串。
想法?
答案 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.