SitePoint Sponsor

User Tag List

Results 1 to 5 of 5
  1. #1
    SitePoint Wizard bronze trophy
    Join Date
    Jul 2006
    Location
    Augusta, Georgia, United States
    Posts
    4,139
    Mentioned
    16 Post(s)
    Tagged
    3 Thread(s)

    ActiveRecord Subquery Implementation

    Posts Table
    Code SQL:
    CREATE TABLE posts (
    	id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
    	,thread_id INT(10) UNSIGNED NOT NULL
    	,user_id INT(10) UNSIGNED NOT NULL
    	,message text NOT NULL
    	,STATUS tinyint UNSIGNED NOT NULL
    	,created TIMESTAMP NULL DEFAULT NULL
    	,PRIMARY KEY(id)
    )ENGINE=MYSIAM;

    Post Model
    PHP Code:
    <?php
    class Post extends ActiveRecord {

        public static 
    $fields = array('id','user_id','thread_id','message','status','created');
        
        public static 
    $foreignKeys = array(
            
    'user_id'=>array('User','id')
            ,
    'thread_id'=>array('Thread','id')
        );
        
        public static 
    $primaryKey 'id';
        
        public static 
    $requiredFields = array('user_id','thread_id','message','status','created');
        
        public static 
    $belongsTo = array('user','thread');
        
        public static 
    $transformations = array(
            
    'created'=>array(
                
    'save'=>'FROM_UNIXTIME({this})'
            
    )
        );
        
        public static 
    $cascadeUpdate = array(
            
    'project'=>array('status'=>'status')
        );
        
        public static function 
    find() {
            
    $args func_get_args();
            return 
    parent::_find(__CLASS__,$args);
        }

    }
    ?>
    Task: select most recent post per thread.

    That task can be broken down into the below method call.

    PHP Code:
    $posts =
    Post::find(
        array(
            
    'select'=>array('message')
            ,
    'include'=>array(
                
    Post::find(
                    
    ActiveRecord::findSelect
                    
    ,array(
                        
    'group'=>'thread_id'
                        
    ,'dynamic'=>array(
                            
    'recent_post'=>'MAX(Post.created)'
                        
    )
                        ,
    'select'=>array('thread_id')
                    )
                )
            )
        )
        ,array(
            
    'association'=>array(
                
    'thread_id'=>'t0_thread_id'
                
    ,'created'=>'t0_recent_post'
            
    )
        )
    ); 
    The above method will generate the following SQL.

    Code SQL:
    SELECT 
          t2.`t0_thread_id` AS t0_thread_id
          ,t2.`t0_id` AS t0_id
          ,t2.`t0_recent_post` AS t0_recent_post
          ,t1.`message` AS t1_message
          ,t1.`id` AS t1_id 
      FROM 
          posts AS t1 
     INNER 
      JOIN 
          (SELECT 
                t0.`thread_id` AS t0_thread_id
                ,t0.`id` AS t0_id
                ,MAX(t0.created) AS t0_recent_post 
             FROM 
                 posts AS t0 
            GROUP 
               BY t0.thread_id) AS t2 
         ON 
           t1.`thread_id` = t2.`t0_thread_id` 
        AND 
           t1.`created` = t2.`t0_recent_post`

    Which will yield the below array of object:

    HTML Code:
    Array
    (
        [0] => Post Object
            (
                [_data:private] => ActiveRecordDataEntity Object
                    (
                        [_data:private] => Array
                            (
                                [message] => Array
                                    (
                                        [0] => xwd w qd qw 
                                    )
    
                                [id] => Array
                                    (
                                        [0] => 11
                                    )
    
                                [posts] => Array
                                    (
                                        [0] => ActiveRecordCollection Object
                                            (
                                                [container:protected] => Array
                                                    (
                                                        [0] => Post Object
                                                            (
                                                                [_data:private] => ActiveRecordDataEntity Object
                                                                    (
                                                                        [_data:private] => Array
                                                                            (
                                                                                [thread_id] => Array
                                                                                    (
                                                                                        [0] => 6
                                                                                    )
    
                                                                                [id] => Array
                                                                                    (
                                                                                        [0] => 8
                                                                                    )
    
                                                                                [recent_post] => Array
                                                                                    (
                                                                                        [0] => 2009-04-13 09:28:08
                                                                                    )
    
                                                                            )
    
                                                                    )
    
                                                            )
    
                                                    )
    
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
        [1] => Post Object
            (
                [_data:private] => ActiveRecordDataEntity Object
                    (
                        [_data:private] => Array
                            (
                                [message] => Array
                                    (
                                        [0] => d wq d qw rf qwr
                                    )
    
                                [id] => Array
                                    (
                                        [0] => 14
                                    )
    
                                [posts] => Array
                                    (
                                        [0] => ActiveRecordCollection Object
                                            (
                                                [container:protected] => Array
                                                    (
                                                        [0] => Post Object
                                                            (
                                                                [_data:private] => ActiveRecordDataEntity Object
                                                                    (
                                                                        [_data:private] => Array
                                                                            (
                                                                                [thread_id] => Array
                                                                                    (
                                                                                        [0] => 8
                                                                                    )
    
                                                                                [id] => Array
                                                                                    (
                                                                                        [0] => 14
                                                                                    )
    
                                                                                [recent_post] => Array
                                                                                    (
                                                                                        [0] => 2009-04-14 09:45:19
                                                                                    )
    
                                                                            )
    
                                                                    )
    
                                                            )
    
                                                    )
    
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
        [2] => Post Object
            (
                [_data:private] => ActiveRecordDataEntity Object
                    (
                        [_data:private] => Array
                            (
                                [message] => Array
                                    (
                                        [0] => r gerg e rgeg
                                    )
    
                                [id] => Array
                                    (
                                        [0] => 17
                                    )
    
                                [posts] => Array
                                    (
                                        [0] => ActiveRecordCollection Object
                                            (
                                                [container:protected] => Array
                                                    (
                                                        [0] => Post Object
                                                            (
                                                                [_data:private] => ActiveRecordDataEntity Object
                                                                    (
                                                                        [_data:private] => Array
                                                                            (
                                                                                [thread_id] => Array
                                                                                    (
                                                                                        [0] => 5
                                                                                    )
    
                                                                                [id] => Array
                                                                                    (
                                                                                        [0] => 7
                                                                                    )
    
                                                                                [recent_post] => Array
                                                                                    (
                                                                                        [0] => 2009-04-24 12:24:36
                                                                                    )
    
                                                                            )
    
                                                                    )
    
                                                            )
    
                                                    )
    
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
        [3] => Post Object
            (
                [_data:private] => ActiveRecordDataEntity Object
                    (
                        [_data:private] => Array
                            (
                                [message] => Array
                                    (
                                        [0] => cxw dew dq
                                    )
    
                                [id] => Array
                                    (
                                        [0] => 18
                                    )
    
                                [posts] => Array
                                    (
                                        [0] => ActiveRecordCollection Object
                                            (
                                                [container:protected] => Array
                                                    (
                                                        [0] => Post Object
                                                            (
                                                                [_data:private] => ActiveRecordDataEntity Object
                                                                    (
                                                                        [_data:private] => Array
                                                                            (
                                                                                [thread_id] => Array
                                                                                    (
                                                                                        [0] => 7
                                                                                    )
    
                                                                                [id] => Array
                                                                                    (
                                                                                        [0] => 13
                                                                                    )
    
                                                                                [recent_post] => Array
                                                                                    (
                                                                                        [0] => 2009-04-24 20:41:36
                                                                                    )
    
                                                                            )
    
                                                                    )
    
                                                            )
    
                                                    )
    
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
        [4] => Post Object
            (
                [_data:private] => ActiveRecordDataEntity Object
                    (
                        [_data:private] => Array
                            (
                                [message] => Array
                                    (
                                        [0] => wd 2 de12e12
                                    )
    
                                [id] => Array
                                    (
                                        [0] => 20
                                    )
    
                                [posts] => Array
                                    (
                                        [0] => ActiveRecordCollection Object
                                            (
                                                [container:protected] => Array
                                                    (
                                                        [0] => Post Object
                                                            (
                                                                [_data:private] => ActiveRecordDataEntity Object
                                                                    (
                                                                        [_data:private] => Array
                                                                            (
                                                                                [thread_id] => Array
                                                                                    (
                                                                                        [0] => 9
                                                                                    )
    
                                                                                [id] => Array
                                                                                    (
                                                                                        [0] => 16
                                                                                    )
    
                                                                                [recent_post] => Array
                                                                                    (
                                                                                        [0] => 2009-05-01 16:20:14
                                                                                    )
    
                                                                            )
    
                                                                    )
    
                                                            )
    
                                                    )
    
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
    )
    The above object property hierarchy can be broken down into (per object):

    • id
    • message
    • posts (subquery node/derived table)
      • id
      • thread_id
      • recent_post


    Now my concern is that the property representing the subquery is named posts based on the root node of that select statement. However, I feel that the name should be determined by the user or add a extra node for the subquery in which to access the data. Something along the lines of the below hierarchy.


    • id
    • message
    • subquery
      • posts (subquery node/derived table)
        • id
        • thread_id
        • recent_post


    However, what would be the best way to allow the user to be able to name that property so that derived information could be accessed through that property?

    PHP Code:
    $posts[0]->subquery->posts[0]->recent_post 
    I'm stumped because normally the property name would be determined based on the model name. However, in this instance the model is derived and doesn't have a name.

    Currently the above information would be accessed as shown below.

    PHP Code:
    $posts[0]->posts[0]->recent_post 
    However, if the outer query joins on the posts table again then a conflict occurs between property names. Which is what brings me to the problem of having the user able to name properties which subquery/derived table data would be accessed.

    any ideas or recommendations appreciated.

  2. #2
    SitePoint Wizard bronze trophy
    Join Date
    Jul 2006
    Location
    Augusta, Georgia, United States
    Posts
    4,139
    Mentioned
    16 Post(s)
    Tagged
    3 Thread(s)
    Dealing with a blog, comments and user the subquery support makes it possible to select the blog, user who posted the blog, most recent comment and the comments user.

    Generate select object for inner most query
    PHP Code:
    $recentComments 
    BlogComment::find(
        
    ActiveRecord::findSelect
        
    ,array(
            
    'group'=>'blog_entry_id'
            
    ,'dynamic'=>array(
                
    'recent_comment'=>'MAX(BlogComment.created)'
            
    )
        )
    ); 
    Generate select object for middle subquery
    PHP Code:
    $comments 
    BlogComment::find(
        
    ActiveRecord::findSelect
        
    ,array(
            
    'include'=>array(
                
    $recentComments
                
    ,'user'
            
    )
            ,
    'group'=>'blog_entry_id'
        
    )
        ,array(
            
    'association'=>array(
                
    'blog_entry_id'=>'t0_blog_entry_id'
                
    ,'created'=>'t0_recent_comment'
            
    )
            ,
    'require'=>true
        
    )
        ,array(
            
    'select'=>'name'
        
    )
    ); 
    Put it all together and run query.
    PHP Code:
    $blogs 
    BlogEntry::find(
        
    ActiveRecord::findAll
        
    ,array(
            
    'deselect'=>array('entry')
            ,
    'include'=>array(
                
    $comments
                
    ,'user'
            
    )
        )
        ,array(
            
    'association'=>array(
                
    'id'=>'t1_blog_entry_id'
            
    )
            ,
    'require'=>false
        
    )
    ); 
    The previous find operation would generate the below query.

    Code SQL:
    SELECT 
         t5.`t0_id` AS t0_id
         ,t5.`t0_blog_entry_id` AS t0_blog_entry_id
         ,t5.`t0_user_id` AS t0_user_id
         ,t5.`t0_message` AS t0_message
         ,t5.`t0_created` AS t0_created
         ,t5.`t0_status` AS t0_status
         ,t5.`t0_recent_comment` AS t0_recent_comment
         ,t5.`t1_id` AS t1_id
         ,t5.`t1_blog_entry_id` AS t1_blog_entry_id
         ,t5.`t1_user_id` AS t1_user_id
         ,t5.`t1_message` AS t1_message
         ,t5.`t1_created` AS t1_created
         ,t5.`t1_status` AS t1_status
         ,t5.`t4_name` AS t4_name
         ,t5.`t4_id` AS t4_id
         ,t2.`id` AS t2_id
         ,t2.`user_id` AS t2_user_id
         ,t2.`title` AS t2_title
         ,t2.`created` AS t2_created
         ,t2.`picture` AS t2_picture
         ,t2.`status` AS t2_status
         ,t6.`name` AS t6_name
         ,t6.`id` AS t6_id 
     FROM 
         blog_entries AS t2 
     LEFT 
     JOIN (
          SELECT 
               t3.`t0_id` AS t0_id
               ,t3.`t0_blog_entry_id` AS t0_blog_entry_id
               ,t3.`t0_user_id` AS t0_user_id
               ,t3.`t0_message` AS t0_message
               ,t3.`t0_created` AS t0_created
               ,t3.`t0_status` AS t0_status
               ,t3.`t0_recent_comment` AS t0_recent_comment
               ,t1.`id` AS t1_id
               ,t1.`blog_entry_id` AS t1_blog_entry_id
               ,t1.`user_id` AS t1_user_id
               ,t1.`message` AS t1_message
               ,t1.`created` AS t1_created
               ,t1.`status` AS t1_status
               ,t4.`name` AS t4_name
               ,t4.`id` AS t4_id 
            FROM 
                blog_comments AS t1 
            INNER 
             JOIN (
                  SELECT 
                       t0.`id` AS t0_id
                       ,t0.`blog_entry_id` AS t0_blog_entry_id
                       ,t0.`user_id` AS t0_user_id
                       ,t0.`message` AS t0_message
                       ,t0.`created` AS t0_created
                       ,t0.`status` AS t0_status
                       ,MAX(t0.created) AS t0_recent_comment 
                    FROM 
                       blog_comments AS t0 
                   GROUP 
                      BY 
                       t0.blog_entry_id) AS t3 
                ON 
                  t1.`blog_entry_id` = t3.`t0_blog_entry_id` 
               AND 
                  t1.`created` = t3.`t0_recent_comment` 
             INNER 
              JOIN 
                  users AS t4 
                ON 
                 t1.user_id = t4.id 
             GROUP 
                BY 
                 t1.blog_entry_id) AS t5 
      ON 
        t2.`id` = t5.`t1_blog_entry_id` 
    INNER 
     JOIN 
         users AS t6 ON t2.user_id = t6.id

    The individual object property hierarchy would then look like the below.

    • blog_entry (root)
      • id
      • user_id
      • title
      • created
      • picture
      • status
      • blog_comments (subquery)
        • id
        • blog_entry_id
        • user_id
        • message
        • created
        • status
        • blog_comments (subquery)
          • id
          • blog_entry_id
          • user_id
          • message
          • created
          • status
          • recent_comment
        • user
          • id
          • name
      • user
        • id
        • name


    However, I would like the developer to have the option of naming the property to access subquery information. Currently, the property name just defaults to the first table/model in the subquery. I would also like the developer to be able to declare whether the subquery relation is singular or plural. Currently, the subquery information defaults to many. This means it must be accessed through an array as defined below.

    PHP Code:
    $blogs[0]->blog_comments[0]->blog_comments[0]->recent_comment 
    However, the relationship expressed here is actually singular so there should be a way i think to make the property name sinular and a object rather then an array.

    PHP Code:
    $blogs[0]->blog_comment->blog_comment->recent_comment 
    However, that can't be determined unless the developer where to actually state that the relation/association is singular on the derived table/model.

  3. #3
    SitePoint Wizard bronze trophy
    Join Date
    Jul 2006
    Location
    Augusta, Georgia, United States
    Posts
    4,139
    Mentioned
    16 Post(s)
    Tagged
    3 Thread(s)
    I think the best solution is just to add a option to override the default model name. Which means it can be overrided for any included model now which is nice I think.

    PHP Code:
    $recentComments 
    BlogComment::find(
        
    ActiveRecord::findSelect
        
    ,array(
            
    'group'=>'blog_entry_id'
            
    ,'dynamic'=>array(
                
    'recent_comment'=>'MAX(BlogComment.created)'
                
    ,'total_comments'=>'COALESCE(COUNT(BlogComment.id),0)'
            
    )
        )
    );

    $comments 
    BlogComment::find(
        
    ActiveRecord::findSelect
        
    ,array(
            
    'include'=>array(
                
    $recentComments
                
    ,'user'
            
    )
            ,
    'group'=>'blog_entry_id'
        
    )
        ,array(
            
    'association'=>array(
                
    'blog_entry_id'=>'t0_blog_entry_id'
                
    ,'created'=>'t0_recent_comment'
            
    )
            ,
    'require'=>true
            
    ,'propertyName'=>'subquery_yyyy'
        
    )
        ,array(
            
    'select'=>'name'
        
    )
    );

    $blogs 
    BlogEntry::find(
        
    ActiveRecord::findAll
        
    ,array(
            
    'deselect'=>array('entry')
            ,
    'include'=>array(
                
    $comments
                
    ,'user'
            
    )
        )
        ,array(
            
    'association'=>array(
                
    'id'=>'t1_blog_entry_id'
            
    )
            ,
    'require'=>false
            
    ,'propertyName'=>'subquery_xxxx'
        
    )
        ,array(
            
    'select'=>'name'
        
    )
    ); 
    PHP Code:
    $blogs[0]->subquery_xxxx[0]->subquery_yyyy[0]->recent_comment
    A native model that is included can now be abstracted with a new name using the propertyName key. I think this is the best solution. Now to create a similar functionality for the one or many argument for includes.

  4. #4
    SitePoint Wizard bronze trophy
    Join Date
    Jul 2006
    Location
    Augusta, Georgia, United States
    Posts
    4,139
    Mentioned
    16 Post(s)
    Tagged
    3 Thread(s)
    So now given a simple example where a blog and its user are found the name of the property that relates to the user can changed to anything rather then being fixed as the model name. That seems to solve the problem with accessing the subquery info and adds yet another level of control to the entire library.

    PHP Code:
    $blog 
    BlogEntry::find(
        
    'one'
        
    ,array(
            
    'include'=>'user'
            
    ,'id'=>10
            
    ,'deselect'=>'entry'
        
    )
        ,array(
            
    'propertyName'=>'changed_this_model_name'
        
    )
    ); 

    PHP Code:
    $blog->changed_this_model_name->name

  5. #5
    SitePoint Wizard bronze trophy
    Join Date
    Jul 2006
    Location
    Augusta, Georgia, United States
    Posts
    4,139
    Mentioned
    16 Post(s)
    Tagged
    3 Thread(s)
    Seems like I finally have this functioning from all my testing.

    Given these models:

    Project Model
    PHP Code:
    <?php
    class Project extends ActiveRecord {

        public static 
    $fields = array('id','user_id','category_id','range_id','title','message','status','created');
        
        public static 
    $transformations = array(
            
    'created'=>array(
                
    'save'=>'FROM_UNIXTIME({this})'
            
    )
        );
        
        public static 
    $foreignKeys = array(
            
    'user_id'=>array('User','id')
            ,
    'category_id'=>array('Category','id')
            ,
    'range_id'=>array('Range','id')
        );
        
        public static 
    $dataTypes = array(
            
    'id'=>'int(10) unsigned'
            
    ,'user_id'=>'int(10) unsigned'
            
    ,'category_id'=>'int(10) unsigned'
            
    ,'range_id'=>'int(10) unsigned'
            
    ,'title'=>'varchar(40)'
            
    ,'message'=>'text'
            
    ,'status'=>'tinyint unsigned'
            
    ,'created'=>'timestamp'
        
    );
        
        public static 
    $links = array(
            
    'User'=>array(
                
    'status'=>'status'    
            
    )
        );
        
        public static 
    $primaryKey 'id';
        
        public static 
    $requiredFields = array('user_id','category_id','range_id','title','message','status','created');
        
        public static 
    $hasMany = array('bids');
        
        public static 
    $hasOne = array('won_project');
        
        public static 
    $belongsTo = array('user','range','category');
        
        public static function 
    find() {
            
    $args func_get_args();
            return 
    parent::_find(__CLASS__,$args);
        }

    }
    ?>
    WonProject Model
    PHP Code:
    <?php
    class WonProject extends ActiveRecord {

        public static 
    $fields = array('id','project_id','bid_id','created');
        
        public static 
    $requiredFields = array('project_id','bid_id','created');
        
        public static 
    $transformations = array(
            
    'created'=>array(
                
    'save'=>'FROM_UNIXTIME({this})'
            
    )
        );
        
        public static 
    $primaryKey 'id';
        
        public static 
    $uniqueKeys = array('project_id','bid_id');
        
        public static 
    $belongsTo = array('project','bid');
        
        public static 
    $foreignKeys = array(
            
    'bid_id'=>array('Bid','id')
            ,
    'project_id'=>array('Project','id')
        );

        public static function 
    find() {
            
    $args func_get_args();
            return 
    parent::_find(__CLASS__,$args);
        }


    }
    ?>
    Range Model
    PHP Code:
    <?php
    class Range extends ActiveRecord {

        public static 
    $fields = array('id','min_value','max_value');
        
        public static 
    $primaryKey 'id';
        
        public static 
    $hasMany = array('projects');
        
        public static function 
    find() {
            
    $args func_get_args();
            return 
    parent::_find(__CLASS__,$args);
        }

    }
    ?>
    The below would then create a navigation menu that has each range and the number of projects per a individual category or not category filter at all. Something that wouldn't be possible without a subquery.

    PHP Code:
        protected function _findRanges($pCategory=null) {
        
            
    $wonProjects WonProject::find(
                
    ActiveRecord::findSelect
                
    ,array(
                    
    'empty'=>true
                    
    ,'select'=>'project_id'
                
    )
            );
        
            
    $find = array(
                
    'select'=>'range_id'
                
    ,'group'=>'range_id'
                
    ,'status <>'=>0
                
    ,'id NOT IN'=>$wonProjects
                
    ,'dynamic'=>array(
                    
    'project_count'=>'COALESCE(COUNT(Project.id),0)'
                
    )
            );
            
            if(!
    is_null($pCategory)) {
                
    $find['category_id'] = $pCategory;
            }
            
            
    $projects Project::find(
                
    ActiveRecord::findSelect
                
    ,$find
            
    );

            return 
    Range::find(
                array(
                    
    'include'=>array(
                        
    $projects
                    
    )
                    ,
    'sort'=>array('min_value'=>'ASC')
                )
                ,array(
                    
    'require'=>false
                    
    ,'association'=>array(
                        
    'id'=>'t1_range_id'
                    
    )
                    ,
    'propertyType'=>'one'
                    
    ,'rename'=>'subquery'
                
    )
            );
        
        } 
    SQL:
    Code SQL:
    SELECT 
          t3.`t1_range_id` AS t1_range_id
          ,t3.`t1_id` AS t1_id
          ,t3.`t1_project_count` AS t1_project_count
          ,t2.`id` AS t2_id
          ,t2.`min_value` AS t2_min_value
          ,t2.`max_value` AS t2_max_value
      FROM 
           ranges AS t2 
      LEFT 
      JOIN (
            SELECT 
                 t1.`range_id` AS t1_range_id
                 ,t1.`id` AS t1_id
                 ,COALESCE(COUNT(t1.id),0) AS t1_project_count 
              FROM 
                  projects AS t1 
             WHERE 
                 t1.STATUS <> ? 
               AND 
                 t1.id NOT IN (
                              SELECT 
                                   t0.`project_id` AS t0_project_id 
                                FROM 
                                   won_projects AS t0
                              ) 
             GROUP 
                BY t1.range_id) AS t3 
         ON 
           t2.`id` = t3.`t1_range_id` 
      ORDER 
         BY 
          t2.min_value ASC

    It kinda goes against the idea of a finder by returning the select object(query) but I think the advantages of this far outweigh the disadvantages.

    Ultimately what would be returned is a collection object(array) with the below property hierarchy.

    • Range Object
      • id => 1
      • min_value => 10
      • max_value => 50
      • subquery => null
    • Range Object
      • id => 5
      • min_value => 500
      • max_value => 1000
      • subquery => Project Object
        • range_id => 5
        • id => 27
        • project_count => 1


    So to get the number of projects in range 5:

    PHP Code:
    $totalProjects =  $ranges[1]->subquery?$ranges[1]->subquery->project_count:0
    Then to avoid conflicts and the save() method from parsing the objects in the hierarchy any related item can be renamed. In this case the related subquery was renamed to subquery. Otherwise the property name would default to the first model in the select of that statement potentially causing conflicts. So if the rename option were omitted the property representing the subquery info would be projects.


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •