2012-12-17 5 views
5

현재 Codeigniter 프레임 워크를 사용하고 있습니다. 아래 코드에서 Animal_model 개체를 갖고 싶습니다. stdClass 개체가 아닙니다.

<?php 
class Animal_model extends CI_Model{ 

    var $idanimal; 
    var $name; 
    public static $table = 'animals'; 

    function __construct() { 
     parent::__construct(); 
    } 

    function getone(self $animal){ 
     $query = $this->db->get_where(self::$table, array('id_animal' => $animal->idanimal)); 

     if($query == FALSE){ 
      return FALSE; 
     }else{ 
      return $query->row(); // How to get an Animal_model object here? 
     } 
    } 
} 

$lion = new Animal_model(); 
$lion->idanimal = 25; 
var_dump($lion); // It says "object(Animal_model)". 

$lion = $lion->getone($lion); 
var_dump($lion); // Now it says "object(stdClass)". 

?> 

$query->row()을 Animal_model 개체로 변환하는 방법은 무엇입니까?

답변

5

CodeIgniter에는이 기능이 내장되어 있습니다!

return $query->row(0, 'Animal_model'); 
+1

고마워, 정확히 내가 찾고 있던거야! – Dacobah

0

첫 번째 var_dump($lion)object(Animal_model)입니다.

그런 다음 $lion->getone($lion); $lion의 결과 $lion의 값을 덮어 이제 하나 FALSE 또는 개체 (stdClass)을 반환 $query->row()의 값입니다.

$query->row()항상은 데이터베이스 결과 개체 (stdClass 개체)를 반환합니다.

코드는 예상대로 수행하고 있습니다. 당신이 유형 Animal_model 될 해당 개체가 필요한 이유

http://ellislab.com/codeigniter/user-guide/database/results.html

내가 물어 봐도 될까요?

+0

'row' 메서드는 데이터베이스 결과 개체를 반환하지 않습니다. stdClass 객체, 배열 또는 사용자 정의 클래스 중에서 선택할 수 있습니다. [this] (http://ellislab.com/codeigniter/user-guide/database/results.html)를 보거나'system/database/DB_Result.php' 내부를 살펴보십시오. –

+0

나는 고쳐졌다. 고마워요. – InsanityDefined

1
if($query == FALSE){ 
     return FALSE; 
    }else{ 
     // How to get an Animal_model object here? 
     $row = $query->row(); 

     $animal = new Animal_model(); 
     $animal->idanimal = $row->idanimal; 
     $animal->name= $row->name; 
     return $animal; 
    } 

위의 내용은 원하는대로 수행되지만 매우 좋은 생각이라고 생각하지 않습니다. Animal과 같은 두 번째 클래스는 동물을 나타내는 데 사용할 수있는 모델을 확장하지 않는 것이 좋습니다.

class Animal 
{ 
    public name = ''; 
    public id = 0; 

    public function __construct($id, $name) 
    { 
     $this->id = $id; 
     $this->name = $name; 
    } 
} 

모델에서 모델 개체를 반환하는 대신 모델의 인스턴스를 만들어 반환 할 수 있습니다.

if($query == FALSE){ 
     return FALSE; 
    }else{ 
     $row = $query->row(); 
     return new Animal($row->idanimal, $row->name); 
    } 

나는 또한 대신 ID를 취할 getone 기능을 변경, 선택 할 경우이 ID가 일치 :

function getone($id){ 

당신이 동물 모델의 거래에 대한 관리자로 모델을 사용하는이 방법 데이터와 함께 반환하고 Animal 개체를 반환합니다.

0

return $ query-> row(); 대신 return $ query-> row(); Animal_model 클래스의 객체를 인스턴스화하고 $ query-> row()의 값을 객체의 속성에 할당 할 수 있습니다. 그러나 나는이 일에 어떤 가치가 있는지 확신하지 못합니다. 당신은 여전히 ​​같은 데이터를 되 찾을 것입니다. 행을 검색 한 후 호출 할 Animal_Model 클래스에 필요한 메서드가 있습니까?

사이드 바 참고 ... 속성을 설명하는 데 "var"를 사용하지 않을 수도 있습니다. 아마도 공개 또는 비공개에 대한 이유를 생각할 수 없다면 "보호 된"것을 사용하고 싶을 것입니다.

+0

var/protected에 대한 팁을 가져 주셔서 감사합니다. – Dacobah

0

질문을 이해하는 경우; 개별 열 데이터 대신 데이터베이스 테이블을 호출 할 때 (Animal_model 유형의) 사용자 정의 Class 객체가 필요합니까?

우선 $ query-> row()를 호출하면 Animal_model 객체를 검색하지 않습니다. 대신 데이터베이스 행 객체를 가져옵니다.어떤 당신은 실제로 개별 데이터 인스턴스를 추출 할 수 있습니다 방식은 나도 추천 데이터베이스 행 개체의 인스턴스를 걸립니다 사용자 정의 정적 함수를 만드는 것이다 클래스를 설계했기 때문에,

$row = $query->row(); 

    echo $row->title; 
    echo $row->name; 
    echo $row->body; 

따라서 및 새 Animal_model 인스턴스를 인스턴스화합니다. 또는 데이터베이스 행 객체의 인스턴스를 가져 와서 해당 객체의 필드를 채우는 메소드.

관련 문제