PDO FETCH_CLASS将多行放入对象数组中

时间:2015-06-10 17:10:41

标签: php arrays oop pdo

我正在尝试从数据库中获取多行预订,我希望每一行都是特定类的实例 - 所以我试图将它们存储在一个多维数组中。

到目前为止,它在创建对象数组方面有效,但是我需要将数组的索引作为预订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;


}

2 个答案:

答案 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'];
        }
    }
}