正在开发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中的名称答案 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'
)
不是使用请求操作来调用请求,而是调用控制器来调用模型 - 可以直接调用模型:
// anywhere
$names = ClassRegistry::init('Gamer.Platforme')->find('list', array(
'conditions' => array(
'id' => $pids
)
));
如果没有缓存元素,此类代码应该不在视图中。而不是在beforeRender函数中,否则编写不可维护的应用程序非常容易。
但是,考虑到问题中的代码,它是另一种选择。