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オブジェクトに変換する方法は?

4

5 に答える 5

6

CodeIgniterにはこのための機能が組み込まれています!

return $query->row(0, 'Animal_model');
于 2012-12-17T15:20:51.767 に答える
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動物を表現するために使用できるモデルを拡張しないような2番目のクラスを用意することをお勧めします。

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オブジェクトを返します。

于 2012-12-17T14:49:28.613 に答える
0

私があなたの質問を理解しているなら; 個々の列データの代わりにデータベーステーブルを呼び出す場合、(Animal_modelタイプの)カスタムClassオブジェクトが必要ですか?

まず、$ query-> row()を呼び出すときに、Animal_modelオブジェクトを取得しません。代わりに、データベース行オブジェクトを取得しています。実際に個々のデータインスタンスを抽出する必要があるのは次のとおりです。

   $row = $query->row(); 

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

したがって、クラスの設計方法のために、データベース行オブジェクトのインスタンスを取得して新しいAnimal_modelインスタンスをインスタンス化するカスタム静的関数を作成することをお勧めします。または、データベース行オブジェクトのインスタンスを取得し、そのオブジェクトのフィールドに入力するメソッド。

于 2012-12-17T14:59:29.920 に答える
0

あなたの最初var_dump($lion)のものはタイプobject(Animal_model)です。

次に、の値をで上書きします。$lionの結果$lion->getone($lion); $lionは、、FALSEまたはの値になり$query->row()、object()を返しますstdClass

$query->row()常にデータベース結果オブジェクト(オブジェクト)を返しますstdClass

あなたのコードはそれが想定されていることをしている。

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

そのオブジェクトがタイプである必要がある理由を尋ねてもいいAnimal_modelですか?

于 2012-12-17T14:48:20.037 に答える
0

$ query-> row();を返す代わりに Animal_modelクラスのオブジェクトをインスタンス化し、$ query-> row()の値をオブジェクトのプロパティに割り当てることができます。しかし、これを行うことに価値があるかどうかはわかりません。引き続き同じデータが返されます。行を取得した後に呼び出す必要があるAnimal_Modelクラスのメソッドはありますか?

サイドバーの注意...プロパティを説明するために「var」を使用しないようにすることをお勧めします。パブリックまたはプライベートの理由が考えられない限り、おそらく「保護」を使用したいと思うでしょう。

于 2012-12-17T14:52:21.880 に答える