0

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

 $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 操作的地方?

注意:我不喜欢在视图中执行此操作,因为我想直接将其输出为 json

4

4 回答 4

3

您可以为模型定义一个 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() 回调而不是 virtualField。这使您可以解码实体以及添加前缀。

于 2013-07-30T01:17:07.527 回答
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 方法将其应用于所有查找。

于 2013-07-29T23:14:25.577 回答
0

Hash::map在这里非常有用。通过指定路径,您只能修改集合的切片。

于 2013-07-30T06:32:45.673 回答
0

我认为你应该在View. 请参阅此示例

于 2013-07-29T21:13:24.143 回答