这个问题类似于Mysql results in PHP - arrays or objects?但是,我的问题扩展了那里讨论的内容。
我正在尝试确定哪种格式更适合处理数据库结果:对象或数组。我不关心性能(据我所知,它没有什么区别)。我的重点更多的是显示结果 - 不创建,更新或删除它们。
到目前为止,我总是通过mysqli_fetch_object
或PDO fetchObject
等功能使用对象。这通常很好用,直到我开始做连接。连接导致奇怪的对象,这些对象是来自两个或多个表的字段的混合。我的代码很快就开始变得混乱。
我应该注意,我正在分配特定的类名,而不是坚持使用默认的stdClass
。我这样做,以便我可以访问我在我的类中创建的任何帮助方法。例如:
foreach ($members as $member)
{
echo $member->full_name();
echo $member->age();
}
为了清楚起见,我正在考虑转移到所有数据库结果的数组。从我读过的其他人也这样做。但是,这使我无法轻松访问我的帮助方法。
使用上面的例子,我想我可以输出名字和姓氏,而不是使用full_name()
方法,这不是什么大问题。至于age()方法,我想我可以创建一个通用实用程序类并将其放在那里。
答案 0 :(得分:7)
我一直使用对象 - 但我不直接从查询中放入数据。使用'set'函数我创建了布局,因此避免了连接和命名冲突的问题。对于'full_name'示例,我可能会使用'as'来获取名称部分,在对象中设置每个部分并提供'get_full_name'作为成员fn。
如果你有野心,你可以为'get_age'添加各种各样的东西。设定一次出生日期并从那里开始疯狂。
编辑: 有几种方法可以从数据中创建对象。您可以预定义类并创建对象,也可以“动态”创建它们。
- >一些v简化示例 - 如果这还不够,我可以添加更多。
动态:
$conn = DBConnection::_getSubjectsDB();
$query = "select * from studies where Status = 1";
$st = $conn->prepare( $query );
$st->execute();
$rows = $st->fetchAll();
foreach ( $rows as $row )
{
$study = (object)array();
$study->StudyId = $row[ 'StudyId' ];
$study->Name = $row[ 'StudyName' ];
$study->Investigator = $row[ 'Investigator' ];
$study->StartDate = $row[ 'StartDate' ];
$study->EndDate = $row[ 'EndDate' ];
$study->IRB = $row[ 'IRB' ];
array_push( $ret, $study );
}
预定义:
/** Single location info
*/
class Location
{
/** Name
* @var string
*/
public $Name;
/** Address
* @var string
*/
public $Address;
/** City
* @var string
*/
public $City;
/** State
* @var string
*/
public $State;
/** Zip
* @var string
*/
public $Zip;
/** getMailing
* Get a 'mailing label' style output
*/
function getMailing()
{
return $Name . "\n" . $Address . "\n" . $City . "," . $State . " " . $Zip;
}
}
<强>用法:强>
$conn = DBConnection::_getLocationsDB();
$query = "select * from Locations where Status = 1";
$st = $conn->prepare( $query );
$st->execute();
$rows = $st->fetchAll();
foreach ( $rows as $row )
{
$location = new Location();
$location->Name= $row[ 'Name' ];
$location->Address = $row[ 'Address ' ];
$location->City = $row[ 'City' ];
$location->State = $row[ 'State ' ];
$location->Zip = $row[ 'Zip ' ];
array_push( $ret, $location );
}
然后你可以循环$ ret并输出邮件标签:
foreach( $ret as $location )
{
echo $location->getMailing();
}
答案 1 :(得分:1)
这是在一天结束时的偏好。就个人而言,我更喜欢物体。虽然CakePHP使用“对象”名称作为数组键来使用数组作为结果。但是,当您在CakePHP中获取相关记录时,事情开始变得有趣。
有了你的问题,你可以简单地在对象中拥有对象。例如:
stdClass Object
(
[id] => 1
[title] => Article Title
[published] => 2013-03-04 16:30:00
[category] => stdClass Object
(
[id] => 1
[name] => Category Name
)
)
然后,您可以在视图中显示相关数据,如下所示:
<?php echo $article->category->name; ?>
或者如果你使用getter和setter:
<?php echo $article->getCategory()->getName(); ?>
没有正确或错误的答案。正如我所说,这都是个人偏好。
答案 2 :(得分:0)
我想你正在谈论在两个或多个表上使用SELECT的奇怪对象。
我通过在我的sql中使用AS
来解决这个问题,为它提供一个更简单的名称。
SELECT IFNULL(SUM(table2.big_name),0) AS sumBig
...
$result=$PDO->fetchObject();
$sum=$result->sumBig;
答案 3 :(得分:0)
我认为以模型的形式表示所有数据及其类型会更好。对于连接和单个对象。这样做总会省略你的问题。
class Member_Details {
public $id;
public $first_name;
public $last_name;
public function FullName() {
return $this -> first_name." ".$this -> last_name;
}
}
class Member_Address {
public $id;
public $address;
public $city;
}
class MemberJoins {
public $objects = array();
}
创建此类后,您可以按以下方式配置JOIN。
$obj_details = new Member_Details();
$obj_address = new Member_Address();
//Add data to the objects and then
//Then create the join object
$obj_address_details = new MemberJoins();
$obj_address_details -> objects = array($obj_details, $obj_address);
这两者都有一个共同的属性id
,可以从中链接数据。