cakephp에서 앱 플러그인을 개발 중입니다. 그리고 나는 기능, 데모 벨로우에 붙어 있습니다.
데이터베이스에는 데이터가있는 "플랫폼"테이블이 있습니다 ( '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를 줄 것이지만 그렇지 않습니다. 배열에 1이 없어도 PC를 제공합니다. 내 기능이 작동하도록 수정하려면 어떻게해야합니까?
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의 이름을 제공합니다.
찾기 데이터를 반환, 그것은 객체의 상태를 수정하지 않습니다. 찾기의 반환 값이 사용되지 않으면 이유 / 혜택없이 SQL 쿼리를 실행합니다.
필드 는 조건이 전달 될 것으로 예상 하거나 현재 모델 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
find를 호출 할 필요가 없습니다. 이렇게하면 다음과 같은 배열이 반환됩니다.
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 함수가 아니라 그렇지 않으면 유지 관리 할 수없는 응용 프로그램을 작성하기가 매우 쉽습니다.
그러나 질문의 코드가 주어지면 하나의 대안입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다