/** * * @param Database_Query_Builder_Select $query */ public function apply_ordering(&$query) { $this->orderby = Arr::get($_GET, 'orderby', ''); $this->orderdir = Arr::get($_GET, 'orderdir') == 'desc' ? 'desc' : 'asc'; if (!in_array($this->orderby, array_keys($this->get_columns()))) { $this->orderby = $this->get_title_column()->get_name(); } if ($this->get_column($this->orderby)->is_foreign_key()) { $fk1_alias = 'o1'; $fk1_table = $this->get_column($this->orderby)->get_referenced_table(); $query->join(array($fk1_table->get_name(), $fk1_alias), 'LEFT OUTER'); $query->on($this->get_name() . '.' . $this->orderby, '=', "{$fk1_alias}.id"); $orderby = $fk1_alias . '.' . $fk1_table->get_title_column()->get_name(); if ($fk1_table->get_title_column()->is_foreign_key()) { $fk2_alias = 'o2'; $fk2_table = $fk1_table->get_title_column()->get_referenced_table(); $query->join(array($fk2_table->get_name(), $fk2_alias), 'LEFT OUTER'); $query->on($fk1_alias . '.' . $fk1_table->get_title_column()->get_name(), '=', "{$fk2_alias}.id"); $orderby = $fk2_alias . '.' . $fk2_table->get_title_column()->get_name(); } $query->order_by($orderby, $this->orderdir); } else { $query->order_by($this->get_name() . '.' . $this->orderby, $this->orderdir); } }
/** * Adds addition tables to "JOIN ...". * * @param mixed $table column name or array($column, $alias) or object * @param string $type join type (LEFT, RIGHT, INNER, etc) * @return Jelly_Builder */ public function join($table, $type = NULL) { return parent::join($this->_model_alias($table), $type); }