2015-06-10 3 views
1

Я пытаюсь получить несколько строк заказов из базы данных, и я хочу, чтобы каждый из них был экземпляром определенного класса, поэтому я попытался сохранить их в многомерном массиве.PDO FETCH_CLASS несколько строк в массив объектов

До сих пор он работал с точки зрения создания массива объектов, однако мне нужен индекс для массива, который будет идентификатором заказа, чтобы я мог легко получить доступ к каждому из них. Например:

$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; 


} 

ответ

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']; 
     } 
    } 
} 
+0

Это замечательное спасибо, это действительно помогло мне это понять. ваш подход имеет гораздо больший смысл, чем то, что я пытался достичь. Я ценю ваше время. – MKC

1

Да, есть способ сделать это.

Трюк PDO::FETCH_GROUP. Просто сделайте

$result = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_CLASS, 'booking'); 

Единственный недостаток в том, что там будет массив в каждом результате до объекта

Там простой способ, чтобы удалить массив слишком

$output= array_map('reset',$result); 
+0

Это большое спасибо. Я вижу, что вы имеете в виду в массиве, должен быть способ удалить это. Есть ли лучший способ сделать это в целом, чем разместить объекты в массиве? – MKC

+0

Вышеуказанный метод должен предоставить вам ваши объекты непосредственно в массиве – cjds

Смежные вопросы