Пример #1
0
 public function builder_call_with_terms(Database_Query $builder, Jam_Event_Data $data, $term_slugs, $operator = 'IN', $nesting_level = 1)
 {
     if ($term_slugs) {
         if (!$term_slugs instanceof Jam_Query_Builder_Collection and !$term_slugs instanceof Jam_Array_Association) {
             $term_slugs = Jam::all('term')->slugs_children($term_slugs)->order_by('id');
         }
         $terms = $term_slugs->as_array('id', 'slug');
         $terms_ids = array_keys($terms);
         if ($nesting_level > 1) {
             $terms = Jam::all('term')->slugs_children(array_values($terms))->order_by('id');
             $terms_ids = Arr::merge($terms_ids, $terms->ids());
         }
         if ($terms_ids) {
             $unique_alias = 'terms-' . join('-', $terms_ids);
             $builder->join(array('terms_items', $unique_alias))->on($unique_alias . '.term_id', $operator, DB::expr("(" . join(',', $terms_ids) . ')'));
         }
     }
     return $builder;
 }
Пример #2
0
 /**
  * For a given foreign key column, join the given query to the foreign table
  * and return the alias for use in selecting against the foreign table.
  * 
  * If the column is not a foreign key, the alias will just be the qualified
  * column name, and no join will be done.
  * 
  * @param WebDB_DBMS_Column $column The column (usually a FK).
  * @param Database_Query $query The query.
  * 
  * @return array Array with 'join_clause' and 'column_alias' keys
  */
 public function join_for($column, &$query)
 {
     $token = Profiler::start('WebDB', __METHOD__);
     if (!$column->is_foreign_key()) {
         return $this->get_name() . '.' . $column->get_name();
     }
     $fk1_table = $column->get_referenced_table();
     $fk1_title_column = $fk1_table->get_title_column();
     $fk1_alias = 'f' . $this->alias_count;
     $query->join(array($fk1_table->get_name(), $fk1_alias), 'LEFT OUTER')->on($this->_name . '.' . $column->get_name(), '=', $fk1_alias . '.id');
     $alias = $fk1_alias . '.' . $fk1_title_column->get_name();
     // FK is also an FK?
     if ($fk1_title_column->is_foreign_key()) {
         $fk2_table = $fk1_title_column->get_referenced_table();
         $fk2_title_column = $fk2_table->get_title_column();
         $fk2_alias = 'ff' . $this->alias_count;
         $query->join(array($fk2_table->get_name(), $fk2_alias), 'LEFT OUTER')->on($fk1_alias . '.' . $fk1_title_column->get_name(), '=', $fk2_alias . '.id');
         $alias = $fk2_alias . '.' . $fk2_title_column->get_name();
     }
     $this->alias_count++;
     Profiler::stop($token);
     return $alias;
 }