我正在尝试从数据库中获取多行预订,我希望每一行都是特定类的实例 - 所以我试图将它们存储在一个多维数组中。
到目前为止,它在创建对象数组方面有效,但是我需要将数组的索引作为预订ID,以便我可以轻松访问每个对象。例如:
$bookings[id] => booking Object ( [name:protected] => name, [time:protected] => time )
这是否可行,是否是实现我想实现目标的最佳方式?任何帮助都将非常感激,这是代码:
class create_bookings {
private $db;
protected $error;
function __construct($db, $current, $end) {
$this->db = $db;
$query = "SELECT id, name, time
FROM bookings";
$stmt = $this->db->prepare($query);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_CLASS, 'booking');
print_r($result);
}
}
...而'预订'类只是一组属性:
class booking {
private $db;
protected $name;
protected $time;
}
答案 0 :(得分:1)
是的,有办法做到这一点。
技巧是PDO::FETCH_GROUP
。只是做
$result = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_CLASS, 'booking');
唯一的缺点是在Object
之前的每个结果中都会有一个数组还有一种删除阵列的简单方法
$output= array_map('reset',$result);
答案 1 :(得分:1)
建议创建独立函数或父类中的函数来实现此目的,而不是构建一个类来创建预订对象。我使用带有fetchAll()
参数的FETCH_CLASS
运行的问题是,对象不能自动访问数据库对象,导致您无论如何都需要迭代对象,所以我只需构建__construct()
方法即可捕获$db
和生成的数组。
假设你走了一个独立功能的路线:
function create_bookings($db, $current, $end) {
$query = "SELECT id, name, time
FROM bookings";
$stmt = $db->prepare($query);
$stmt->execute();
$result = array()
$bookings = $stmt->fetchAll();
if($bookings) {
foreach($bookings as $booking) {
$result[$booking['id']] = new booking($db, $booking);
}
}
return $result;
}
class booking {
private $db;
public $id;
public $name;
public $time;
public function __construct($db, $array) {
if(/*validate your array here*/) {
$this->db = $db;
$this->id = $array['id'];
$this->name = $array['name'];
$this->time = $array['time'];
}
}
}