2012-12-17 16 views
5

Obecnie pracuję z framemwork Codeigniter. W poniższym kodzie chciałbym uzyskać obiekt Animal_model, a nie obiekt 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)". 

?> 

Jak przekonwertować obiekt $query->row() na obiekt obiektu Animal_model?

Odpowiedz

5

CodeIgniter ma wbudowaną funkcjonalność do tego!

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

Dzięki, właśnie tego szukałem! – Dacobah

0

Twój pierwszy var_dump($lion) jest typu object(Animal_model).

wtedy nadpisać wartość $lion z wynikiem $lion->getone($lion); $lion jest teraz albo FALSE lub wartość $query->row(), która zwraca obiekt (stdClass).

$query->row() będzie zawsze zwrócić obiekt wynik bazy danych (a stdClass obiektu).

Twój kod działa tak, jak powinien.

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

Mogę zapytać dlaczego trzeba, że ​​obiekt, aby być typu Animal_model?

+0

Metoda 'row' nie zwróci alwausowi obiektu wynikowego bazy danych. Możesz wybrać obiekt stdClass, tablicę lub niestandardową klasę. Zobacz [this] (http://ellislab.com/codeigniter/user-guide/database/results.html) lub zajrzyj do katalogu 'system/database/DB_Result.php'. –

+0

Stoję poprawione. Dziękuję za to. – 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; 
    } 

Powyższe zrobi to, co chcesz, ale nie sądzę, że to bardzo dobry pomysł. Byłoby lepiej mieć drugą klasę, taką jak Animal, która nie rozszerza modelu, który można wykorzystać do reprezentowania zwierzęcia.

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

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

W modelu można tworzyć wystąpienia tego i zwracać je zamiast zwracać obiekty modelu.

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

Chciałbym również zmienić funkcję getone wziąć identyfikator zamiast i wybierz gdzie ten identyfikator mecze:

function getone($id){ 

W ten sposób można korzystać z modelu jako manager dla zwierząt, zajmuje modelowe z danymi i zwraca obiekty zwierząt.

0

Zamiast zwrotu $ zapytanie-> wiersz(); można utworzyć instancję obiektu klasy Animal_model i przypisać wartości z $ query-> row() do właściwości obiektu. Ale nie jestem pewien, czy widzę jakąś wartość w tym zakresie. Nadal będziesz otrzymywać te same dane. Czy istnieje metoda, której potrzebujesz w klasie Animal_Model, do której chcesz zadzwonić po pobraniu wiersza?

Notatka na pasku bocznym ... Możesz chcieć uniknąć użycia "var", aby opisać swoje właściwości. Prawdopodobnie chcesz użyć "Protected", chyba że możesz wymyślić powód dla Public lub Private.

+0

Dziękujemy za podpowiedź na temat var/protected. – Dacobah

0

Jeśli rozumiem twoje pytanie; kiedy nawiązujesz połączenie z tabelą bazy danych zamiast pojedynczych danych kolumny, czy chcesz mieć niestandardowy obiekt klasy (typu Animal_model)?

Przede wszystkim, gdy wykonasz połączenie z $ query-> row(), nie pobierzesz obiektu Animal_model. Zamiast tego pobierasz obiekt wiersza bazy danych.Które rzeczywiście trzeba wyodrębnić poszczególne instancje danych z:

$row = $query->row(); 

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

Dlatego też, ze względu na sposób, w jaki zostały zaprojektowane swoją klasę Chciałbym też zalecamy utworzenie niestandardowego statyczną funkcję, która weźmie instancję obiektu wiersza bazy danych i utworzyć instancję nowej instancji klasy Animal_model. Lub metoda, która pobiera wystąpienie obiektu wiersza bazy danych i wypełnia pola tego obiektu.