Login | Register
My pages Projects Community openCollabNet

Reply to message

2020-03-13: This site is going to be decommissioned and shut down very soon. Please copy and archive any data you wish to keep ASAP

* = Required fields
* Subject
* Body
Send reply to
Author (directly in email)
Please type the letters in the image above.

Original message

Author Sven Tietje <tietje@topconcepts.de>
Full name Sven Tietje <tietje@topconcepts.de>
Date 2006-10-04 02:56:24 PDT
Message David Zulke wrote:
> 1) memory consumption is a lot lower, e.g. when iterating over 1000
> rows to display them, a row is fetched, the data is displayed, and
> the GC can then go ahead and destroy the object.

Think, that should be an option. Sometimes, i want do iterator over a
resultset and to write baseobjects with special information into an array or
something like that. PDO handles it the same way - Fetchmode gives you
special options for fetching as object:

Using PDO::FETCH_CLASS will result into an object-instance for each row: 200
rows in your resultset will give you 200 object-instances.

PDO::FETCH_INTO will give you the same object-instance for each row: 200
rows, but one object-instance.

Having the same feature / option for propel would be nice:

1. One Instance for all rows
$resultset = TablePeer::doSelect(new Criteria(), PROPEL::ONE_OBJECT);

foreach ($resultset as $row) {
    echo $row //will give you the same object instance
I would use PROPEL::ONE_OBJECT to publish big resultsets. I don`t manipulate
the object. With $myrow = clone $row it is possible to get my own instance
of the row.
2. An Instance for each row
$resultset = TablePeer::doSelect(new Criteria(), PROPEL::EACH_OBJECT);
foreach ($resultset as $row) {
    echo $row //will result in Object#1, Object#2 ..... Object#200

Internally Propel uses clone() to create a single instance of each row.

> 2) it opens the door for a potential
> CategoryPeer::doSele​ctJoinProducts() support, where fetching 1:n
> relations with a join would become possible.

We should discuss to use
PDOStatement::setFetchMode ( int PDO::FETCH_CLASS, string classname ) or
PDOStatement::setFetchMode ( int PDO::FETCH_INTO, object object )
instead of hydrate();

I wrote a little script to test it:

$stmt = $pdo->prepare('select name as `customer.name` from customer');

class baseobject /*implements ArrayAccess*/ {
    private $data = array(
        'customer.name' => null,
    // for hydrate
    public function __set($key, $value) {
        $this->data[$key] = $value;

    public function setName($value) {
        $this->data['customer.name'] = $value;
    public function getName() {
        if (isset($this->da​ta['customer.name'])​) {
            return $this->data['cus​tomer.name'];


$blub = new baseobject;
$stmt->setFetchM​ode(PDO::FETCH_INTO,​ $blub);

$arg = array();
while ($b = $stmt->fetch()) {
    // $b->setName('blah');

Implement ArrayAccess into an BaseObject could be a possibility, too. We
should discuss it.

Your opinion? I think to use the power of pdo would be nice.