如何将PHP函数应用于从CakePHP查询返回的列

时间:2013-07-29 20:57:57

标签: php cakephp cakephp-appmodel

在我的控制器中,我正在使用以下字段从我的机构表中检索记录

 $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

4 个答案:

答案 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)

CakePHP是php

只需遍历数组并按照您的要求进行准备:

$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在这里非常有用。通过指定路径,您只能修改集合的切片。