Cakephp - 获取名称功能

时间:2013-07-09 08:35:43

标签: cakephp

  

正在开发cakephp上的app插件。我被困在一个功能上,   演示吼叫:

     

在数据库中我有一个带有数据的表“平台”('1'=>'PC','2'   => 'PS3'......)。

     

在游戏视图中,我有:

<? 
$platformes = array($igra['Igra']['pid']); /* gives me 1,2 */
$platforme = $this->requestAction(
    array(
        'plugin' => 'gamer', 
        'controller' => 'Igra', 
        'action' => 'getPlatformaIme'
    ),
    $platformes
); 
?>
     

在控制器中我有这样的功能:

function getPlatformaIme($pids) {
    $platforme =  explode(', ', $pids);
    $this->loadModel('Gamer.Platforme');

    foreach($platforme as $pid) {
        $this->Platforme->find('all', array(
            'conditions' => array('Platforme.id' => $pid)
        ));
        $name[] = $this->Platforme->field('name');
    }

    return implode(', ', $name);
}
     

这应该给我PC,PS3,但它没有。它给了我PC,即使   数组中没有1。我如何修复我的功能?

Tnx的帮助,这是正确的方法。

功能:

function getPlatformaIme($pids) {
    $platforme[] =  explode(',', $pids);
    $this->loadModel('Gamer.Platforme');

    foreach($platforme as $pid) {
    $names = $this->Platforme->find('list', array(
        'conditions' => array(
            'Platforme.id' => $pid
        )
    ));
    }

    return implode(', ', $names);
}

如果数组是(1,2)返回(PC,PS3)

,则给出db中的名称

1 个答案:

答案 0 :(得分:0)

请参阅文档

find返回数据,它不会修改对象的状态。如果没有使用find的返回值,它会无缘无故地发出sql查询。

field要求传递 条件,否则它将读取当前模型ID的字段值。在问题中没有条件,并且模型没有id集 - 因此,实际上,随机记录的名称字段将被多次返回(可能是相同的名称,但不一定)。

更正了代码而不更改逻辑:

问题中的代码可以更正如下:

function getPlatformaIme($pids) {
    $platforme =  explode(', ', $pids);
    $this->loadModel('Gamer.Platforme');

    foreach($platforme as $pid) {
        $this->Platforme->id = $pid;
        $name[] = $this->Platforme->field('name');
    }

    return implode(', ', $name);
}

使用field,也无需再调用查找。这将返回如下数组:

array(
    'One',
    NULL, # <- if the pid doesn't exist
    'Three'
)

使用适当的查找

以上不是获取名称数组的最合理方式,find('list')存在于此类用例中:

function getPlatformaIme($pids) {
    $platforme =  explode(', ', $pids);
    $this->loadModel('Gamer.Platforme');

    return $this->Platforme->find('list', array(
        'conditions' => array(
            'id' => $pids
        )
    ));
}

这将返回如下数组:

array(
    1 => 'One',
    3 => 'Three'
)

requestAction不是必需的

不是使用请求操作来调用请求,而是调用控制器来调用模型 - 可以直接调用模型:

// anywhere
$names = ClassRegistry::init('Gamer.Platforme')->find('list', array(
    'conditions' => array(
        'id' => $pids
     )
 ));

如果没有缓存元素,此类代码应该在视图中。而不是在beforeRender函数中,否则编写不可维护的应用程序非常容易。

但是,考虑到问题中的代码,它是另一种选择。