Loading only parts of the user seems fine to me, you have 3 main approaches for doing so:
1) Lazy loading, put a proxy in fields/relations you don't always need and reload if requested (not a fan of this in php)
2) Specify which fields you want at the query stage
3) Create additional classes e.g. User extends UserBasicInfo
With option 2, you can get round the problem of overwriting the empty data, by tracking dirty fields. Each set, marks a field as dirty, the update statment is then built only using dirty fields i.e. if a field value hasnt changed, it isnt updated.
Getting round the problem of the last 10 orders and the users, I've given up trying to make the OO nice, and basically followed the DB structure on the idea that I'd rather have efficient queries than the cleanest OO.
What I currently do, is build the query and in this case, the user id would be in the order, so I tell it to grab the 10 most recent queries, and that that the user id is a foreign key, so it should do a join and the itterator will return an array of objects (order, user) reducing it to 1 query, which is generated on the fly - but loosing the ability to say: $order->getUser()
For me, I can live with the lack of oo purity. I know some can't.