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; }
/** * 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; }