Php 如何使用$query获取类对象->;罗恩编码点火器
我目前正在使用Codeigniter框架。在下面的代码中,我想得到一个Php 如何使用$query获取类对象->;罗恩编码点火器,php,codeigniter,object,stdclass,Php,Codeigniter,Object,Stdclass,我目前正在使用Codeigniter框架。在下面的代码中,我想得到一个Animal_model对象,而不是stdClass对象 <?php class Animal_model extends CI_Model{ var $idanimal; var $name; public static $table = 'animals'; function __construct() { parent::__construct(); }
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()
转换为动物模型对象?您的第一个变量转储($lion)
类型为对象(动物模型)
然后用$lion->getone($lion)的结果覆盖$lion
的值代码>
$lion
现在要么是FALSE
,要么是$query->row()
的值,该值返回一个对象(stdClass
)
$query->row()
将始终返回数据库结果对象(一个stdClass
对象)
你的代码正在做它应该做的事情
我可以问一下为什么您需要该对象的类型为动物模型
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);
}
我还将更改getone
函数,改为获取ID,并选择此ID匹配的位置:
function getone($id){
通过这种方式,您可以将模型用作动物的管理器,模型将处理数据并返回动物对象。而不是返回$query->row();您可以实例化Animal_model类的对象,并将$query->row()中的值分配给该对象的属性。但我不确定这样做有什么价值。您仍将获得相同的数据。在Animal_Model类中是否有一个方法需要在检索行后调用
if($query == FALSE){
return FALSE;
}else{
$row = $query->row();
return new Animal($row->idanimal, $row->name);
}
边栏注释。。。您可能希望避免使用“var”来描述您的属性。也许你想用“Protected”这个词,除非你能想出公开或私人的理由。如果我理解你的问题;当您调用数据库表而不是单个列数据时,您希望自定义类对象(类型为Animal\u model),对吗
首先,当您调用$query->row()时,您不会检索动物模型对象。您正在检索数据库行对象。您实际上必须从中提取各个数据实例:
$row = $query->row();
echo $row->title;
echo $row->name;
echo $row->body;
因此,由于您设计类的方式,我建议您创建一个自定义静态函数,该函数将获取数据库行对象的实例,并实例化一个新的Animal_模型实例。或者是一种方法,它获取数据库行对象的实例并填充所述对象的字段。CodeIgniter为此具有内置功能
return $query->row(0, 'Animal_model');
行
方法不会返回数据库结果对象。您可以在stdClass对象、数组或自定义类之间进行选择。查看或查看system/database/DB_Result.php
。谢谢,这正是我想要的!感谢您提供有关var/protected的提示。