views:

140

answers:

1

I'm loading lots of User and related Group objects from a custom PDO query (using the Doctrine connection => $dbh = Doctrine_Manager::connection()->getDbh(); ). The query involves a cross join which isn't supported in DQL.

I'm manually creating the objects and passing the values like so:

    foreach($pdo as $p) {    
        $u = new User();
        $u->userid = $p['userid'];
        $u->username = $['username'];
        //$u->some_field; skipped on purpose
        $u->Group->groupid = $['groupid'];
        $u->Group->groupname = $['groupname'];
        array_push($return, $set);
    }

I was hoping to be able to save the User() object (because of the $u->some_field which can be changed in this context). However Doctrine tries to insert and a key-constraint is violated.

I understand that the error is thrown, however I want to be able to only update that some_field column (and maybe most importantly: NOT THE GROUP). Is this all even possible using the above preloading?

+1  A: 

Well, you're creating new objects so doctrine tries to persist them.

Read about doctrine's record states: http://www.doctrine-project.org/documentation/manual/1_2/en/component-overview:record:getting-record-state

You can influence record state by manipulating _state protected variable.

Also, take a look at constructor of Doctrine_Record. Maybe creating User object in a different way would help:

$u = new User('User', false);

Looks a bit weird but if first argument is not given than second is ignored. Second argument tells if object is new or not and makes that state is set as you wanted.

I would also look at how doctrine hydrates objects internally.

kuba
Changing the constructor does not help... I currently use an update query to do the magic, messing with the (internal) record state doesn't seem good, as it's controlled internally right..?
Ropstah
Well, _state is protected so all extending classes have right to play with it.If you don't want to do it than I'd try to hydrate records with Doctrine_Hydrator_RecordDriver. Take a look at Doctrine_Query_Abstract::execute() method to see how doctrine hydrates objects.
kuba