From 939d0a43d6dccbbcaf2437c2d290f023727248b2 Mon Sep 17 00:00:00 2001 From: Deon George Date: Wed, 6 Apr 2011 09:06:27 +1000 Subject: [PATCH] Enhancements to Kohana ORM Enhancements to include multiple primary keys in remote joins, added option to suppress table names in joins More enhancements to ORM specific from TSM --- .../kohana/modules/orm/classes/kohana/orm.php | 72 +++++++++++++------ 1 file changed, 51 insertions(+), 21 deletions(-) diff --git a/includes/kohana/modules/orm/classes/kohana/orm.php b/includes/kohana/modules/orm/classes/kohana/orm.php index 384046c..b80ab33 100644 --- a/includes/kohana/modules/orm/classes/kohana/orm.php +++ b/includes/kohana/modules/orm/classes/kohana/orm.php @@ -66,6 +66,12 @@ class Kohana_ORM { // Model configuration protected $_table_names_plural = TRUE; protected $_reload_on_wakeup = TRUE; + // Suppress ORMs inclusion of .* + protected $_disable_wild_select = FALSE; + // Suppress ORMs inclusion of . to column joins + protected $_disable_join_table_name = FALSE; + // Suppress ORMs use of limit + protected $_disable_limit = FALSE; // Database configuration protected $_db = NULL; @@ -327,7 +333,7 @@ class Kohana_ORM { $model = $this->_related($column); // Use this model's column and foreign model's primary key - $col = $model->_table_name.'.'.$model->_primary_key; + $col = ($this->_disable_join_table_name ? '' : $model->_table_name.'.').$model->_primary_key; $val = $this->_object[$this->_belongs_to[$column]['foreign_key']]; $model->where($col, '=', $val)->find(); @@ -339,7 +345,7 @@ class Kohana_ORM { $model = $this->_related($column); // Use this model's primary key value and foreign model's column - $col = $model->_table_name.'.'.$this->_has_one[$column]['foreign_key']; + $col = ($this->_disable_join_table_name ? '' : $model->_table_name.'.').$this->_has_one[$column]['foreign_key']; $val = $this->pk(); $model->where($col, '=', $val)->find(); @@ -350,29 +356,52 @@ class Kohana_ORM { { $model = ORM::factory($this->_has_many[$column]['model']); - if (isset($this->_has_many[$column]['through'])) + if (! is_array($this->_has_many[$column]['foreign_key'])) { - // Grab has_many "through" relationship table - $through = $this->_has_many[$column]['through']; + if (isset($this->_has_many[$column]['through'])) + { + // Grab has_many "through" relationship table + $through = $this->_has_many[$column]['through']; - // Join on through model's target foreign key (far_key) and target model's primary key - $join_col1 = $through.'.'.$this->_has_many[$column]['far_key']; - $join_col2 = $model->_table_name.'.'.$model->_primary_key; + // Join on through model's target foreign key (far_key) and target model's primary key + $join_col1 = ($this->_disable_join_table_name ? '' : $through.'.').$this->_has_many[$column]['far_key']; + $join_col2 = ($this->_disable_join_table_name ? '' : $model->_table_name.'.').$model->_primary_key; - $model->join($through)->on($join_col1, '=', $join_col2); + $model->join($through)->on($join_col1, '=', $join_col2); - // Through table's source foreign key (foreign_key) should be this model's primary key - $col = $through.'.'.$this->_has_many[$column]['foreign_key']; - $val = $this->pk(); + // Through table's source foreign key (foreign_key) should be this model's primary key + $col = ($this->_disable_join_table_name ? '' : $through.'.').$this->_has_many[$column]['foreign_key']; + $val = $this->pk(); + } + else + { + // Simple has_many relationship, search where target model's foreign key is this model's primary key + $col = ($this->_disable_join_table_name ? '' : $model->_table_name.'.').$this->_has_many[$column]['foreign_key']; + $val = $this->pk(); + } + + return $model->where($col, '=', $val); } else { - // Simple has_many relationship, search where target model's foreign key is this model's primary key - $col = $model->_table_name.'.'.$this->_has_many[$column]['foreign_key']; - $val = $this->pk(); - } + foreach ($this->_has_many[$column]['foreign_key'] as $fk) + { + if (isset($this->_has_many[$column]['through'])) + { + throw new Kohana_Exception('This code hasnt been written yet!'); + } + else + { + // Simple has_many relationship, search where target model's foreign key is this model's primary key + $col = ($this->_disable_join_table_name ? '' : $model->_table_name.'.').$fk; + $val = $this->_object[$fk]; + } - return $model->where($col, '=', $val); + $model = $model->where($col, '=', $val); + } + + return $model; + } } else { @@ -763,7 +792,7 @@ class Kohana_ORM { if ($id !== NULL) { // Search for a specific column - $this->_db_builder->where($this->_table_name.'.'.$this->_primary_key, '=', $id); + $this->_db_builder->where(($this->_disable_join_table_name ? '' : $this->_table_name.'.').$this->_primary_key, '=', $id); } return $this->_load_result(FALSE); @@ -1260,14 +1289,15 @@ class Kohana_ORM { { $this->_db_builder->from($this->_table_name); - if ($multiple === FALSE) + if ($multiple === FALSE AND ! $this->_disable_limit) { // Only fetch 1 record $this->_db_builder->limit(1); } // Select all columns by default - $this->_db_builder->select($this->_table_name.'.*'); + if (! $this->_disable_wild_select) + $this->_db_builder->select($this->_table_name.'.*'); if ( ! isset($this->_db_applied['order_by']) AND ! empty($this->_sorting)) { @@ -1276,7 +1306,7 @@ class Kohana_ORM { if (strpos($column, '.') === FALSE) { // Sorting column for use in JOINs - $column = $this->_table_name.'.'.$column; + $column = ($this->_disable_join_table_name ? '' : $this->_table_name.'.').$column; } $this->_db_builder->order_by($column, $direction);