PHP ORM style of querying
        Posted  
        
            by 
                Petah
            
        on Programmers
        
        See other posts from Programmers
        
            or by Petah
        
        
        
        Published on 2011-02-06T12:18:45Z
        Indexed on 
            2011/02/06
            15:33 UTC
        
        
        Read the original article
        Hit count: 399
        
Ok so I have made an ORM library for PHP. It uses syntax like so:
*(assume that $business_locations is an array)*
Business::type(Business:TYPE_AUTOMOTIVE)->
          size(Business::SIZE_SMALL)->
          left_join(BusinessOwner::table(), BusinessOwner::business_id(), SQL::OP_EQUALS, Business::id())->
          left_join(Owner::table(), SQL::OP_EQUALS, Owner::id(), BusinessOwner::owner_id())->
          where(Business::location_id(), SQL::in($business_locations))->
          group_by(Business::id())->
          select(SQL::count(BusinessOwner::id());
Which can also be represented as:
$query = new Business();
$query->set_type(Business:TYPE_AUTOMOTIVE);
$query->set_size(Business::SIZE_SMALL);
$query->left_join(BusinessOwner::table(), BusinessOwner::business_id(), SQL::OP_EQUALS, $query->id());
$query->left_join(Owner::table(), SQL::OP_EQUALS, Owner::id(), BusinessOwner::owner_id());
$query->where(Business::location_id(), SQL::in($business_locations));
$query->group_by(Business::id());
$query->select(SQL::count(BusinessOwner::id());
This would produce a query like:
SELECT COUNT(`business_owners`.`id`)
FROM   `businesses`
       LEFT JOIN `business_owners`
         ON `business_owners`.`business_id` = `businesses`.`id`
       LEFT JOIN `owners`
         ON `owners`.`id` = `business_owners`.`owner_id`
WHERE  `businesses`.`type` = 'automotive'
       AND `businesses`.`size` = 'small'
       AND `businesses`.`location_id` IN ( 1, 2, 3, 4 )
GROUP  BY `businesses`.`id`  
Please keep in mind that the syntax might not be prefectly correct (I only wrote this off the top of my head)
- Any way, what do you think of this style of querying?
- Is the first method or second better/clearer/cleaner/etc?
- What would you do to improve it?
© Programmers or respective owner