在我的控制器中,我正在使用以下字段从我的机构表中检索记录
$params = array(
'fields' => array(
'Institution.id',
'Institution.name',
'Institution.about',
'Institution.picture'),
);
$institutions = $this->Institution->find('all',$params);
如何为每个'Institution.picture'字段添加完整的URL地址前缀,'Institution.picture'本身只保存文件的名称。
我还想对返回集合中的每个'Institution.about'值执行html_entity_decode()。
如果我从头开始自定义查询,我知道如何在没有框架的情况下执行此操作,然后我将迭代每一行并将PHP函数应用于感兴趣的字段。但是在CakePHP(查找或分页符)中是否有一个位置,我可以从返回的集合中为每个字段值指定这样的PHP操作?
注意:我不喜欢在View中执行此操作,因为我想直接将其输出为json
答案 0 :(得分:3)
您可以为模型定义a virtualField:
public $virtualFields = array('image_url' => "CONCAT('/img/', Institution.picture)");
$params = array(
'fields' => array(
'Institution.id',
'Institution.name',
'Institution.about',
'Institution.picture',
'Institution.image_url'),
);
$institutions = $this->Institution->find('all',$params);
不幸的是,MySQL没有解码HTML实体的功能。您可以使用afterFind() callback而不是virtualField。这使您可以解码实体并添加前缀。
答案 1 :(得分:2)
只需遍历数组并按照您的要求进行准备:
$institutions = $this->Institution->find('all',$params);
$prefix = '/img/'; // <- define this
foreach ($institutions as &$row) {
$row['Institution']['about'] = html_entity_decode($row['Institution']['about']);
$row['Institution']['picture'] = $prefix . $row['Institution']['picture'];
}
如果始终需要,可以通过机构类中的afterFind method将其应用于所有查找。
答案 2 :(得分:0)
我认为你应该在View
中做到这一点。请参阅this example。
答案 3 :(得分:0)
Hash::map在这里非常有用。通过指定路径,您只能修改集合的切片。