Model::has_many_through PHP Method

has_many_through() protected method

Helper method to manage many-to-many relationships via an intermediate model. See README for a full explanation of the parameters.
protected has_many_through ( string $associated_class_name, null | string $join_class_name = null, null | string $key_to_base_table = null, null | string $key_to_associated_table = null, null | string $key_in_base_table = null, null | string $key_in_associated_table = null, null | string $connection_name = null ) : ORMWrapper
$associated_class_name string
$join_class_name null | string
$key_to_base_table null | string
$key_to_associated_table null | string
$key_in_base_table null | string
$key_in_associated_table null | string
$connection_name null | string
return ORMWrapper
    protected function has_many_through($associated_class_name, $join_class_name = null, $key_to_base_table = null, $key_to_associated_table = null, $key_in_base_table = null, $key_in_associated_table = null, $connection_name = null)
    {
        $base_class_name = get_class($this);
        // The class name of the join model, if not supplied, is
        // formed by concatenating the names of the base class
        // and the associated class, in alphabetical order.
        if (is_null($join_class_name)) {
            $base_model = explode('\\', $base_class_name);
            $base_model_name = end($base_model);
            if (substr($base_model_name, 0, strlen(self::$auto_prefix_models)) == self::$auto_prefix_models) {
                $base_model_name = substr($base_model_name, strlen(self::$auto_prefix_models), strlen($base_model_name));
            }
            // Paris wasn't checking the name settings for the associated class.
            $associated_model = explode('\\', $associated_class_name);
            $associated_model_name = end($associated_model);
            if (substr($associated_model_name, 0, strlen(self::$auto_prefix_models)) == self::$auto_prefix_models) {
                $associated_model_name = substr($associated_model_name, strlen(self::$auto_prefix_models), strlen($associated_model_name));
            }
            $class_names = array($base_model_name, $associated_model_name);
            sort($class_names, SORT_STRING);
            $join_class_name = join("", $class_names);
        }
        // Get table names for each class
        $base_table_name = self::_get_table_name($base_class_name);
        $associated_table_name = self::_get_table_name(self::$auto_prefix_models . $associated_class_name);
        $join_table_name = self::_get_table_name(self::$auto_prefix_models . $join_class_name);
        // Get ID column names
        $base_table_id_column = is_null($key_in_base_table) ? self::_get_id_column_name($base_class_name) : $key_in_base_table;
        $associated_table_id_column = is_null($key_in_associated_table) ? self::_get_id_column_name(self::$auto_prefix_models . $associated_class_name) : $key_in_associated_table;
        // Get the column names for each side of the join table
        $key_to_base_table = self::_build_foreign_key_name($key_to_base_table, $base_table_name);
        $key_to_associated_table = self::_build_foreign_key_name($key_to_associated_table, $associated_table_name);
        /*
            "   SELECT {$associated_table_name}.*
                  FROM {$associated_table_name} JOIN {$join_table_name}
                    ON {$associated_table_name}.{$associated_table_id_column} = {$join_table_name}.{$key_to_associated_table}
                 WHERE {$join_table_name}.{$key_to_base_table} = {$this->$base_table_id_column} ;"
        */
        return self::factory($associated_class_name, $connection_name)->select("{$associated_table_name}.*")->join($join_table_name, array("{$associated_table_name}.{$associated_table_id_column}", '=', "{$join_table_name}.{$key_to_associated_table}"))->where("{$join_table_name}.{$key_to_base_table}", $this->{$base_table_id_column});
    }