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
            // fOneed by concatenating the names of the base class
            // and the associated class, in alphabetical order.
            if (is_null($join_class_name)) {
                $model = explode('\\', $base_class_name);
                $model_name = end($model);

                if (substr($model_name, 0, strlen(self::$auto_prefix_models)) == self::$auto_prefix_models) {
                    $model_name = substr($model_name, strlen(self::$auto_prefix_models), strlen($model_name));
                }

                $class_names = [$model_name, $associated_class_name];
                sort($class_names, SORT_STRING);
                $join_class_name = join("", $class_names);
            }

            // Get table names for each class
            $base_table_name = self::_getTableName($base_class_name);
            $associated_table_name = self::_getTableName(self::$auto_prefix_models . $associated_class_name);
            $join_table_name = self::_getTableName(self::$auto_prefix_models . $join_class_name);

            // Get ID column names
            $base_table_id_column = (is_null($key_in_base_table)) ?
                self::_getIdColumnName($base_class_name) :
                $key_in_base_table;
            $associated_table_id_column = (is_null($key_in_associated_table)) ?
                self::_getIdColumnName(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::_buildForeignKeyName($key_to_base_table, $base_table_name);
            $key_to_associated_table = self::_buildForeignKeyName($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, ["{$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);
        }
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
            // fOneed by concatenating the names of the base class
            // and the associated class, in alphabetical order.
            if (is_null($join_class_name)) {
                $model = explode('\\', $base_class_name);
                $model_name = end($model);

                if (substr($model_name, 0, strlen(self::$auto_prefix_models)) == self::$auto_prefix_models) {
                    $model_name = substr($model_name, strlen(self::$auto_prefix_models), strlen($model_name));
                }

                $class_names = [$model_name, $associated_class_name];
                sort($class_names, SORT_STRING);
                $join_class_name = join("", $class_names);
            }

            // Get table names for each class
            $base_table_name = self::_getTableName($base_class_name);
            $associated_table_name = self::_getTableName(self::$auto_prefix_models . $associated_class_name);
            $join_table_name = self::_getTableName(self::$auto_prefix_models . $join_class_name);

            // Get ID column names
            $base_table_id_column = (is_null($key_in_base_table)) ?
                self::_getIdColumnName($base_class_name) :
                $key_in_base_table;
            $associated_table_id_column = (is_null($key_in_associated_table)) ?
                self::_getIdColumnName(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::_buildForeignKeyName($key_to_base_table, $base_table_name);
            $key_to_associated_table = self::_buildForeignKeyName($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, ["{$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);
        }
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 // fOneed by concatenating the names of the base class // and the associated class, in alphabetical order. if ( is_null ( $ join_class_name ) ) { $ model = explode ( '\\' , $ base_class_name ) ; $ model_name = end ( $ model ) ; if ( substr ( $ model_name , 0 , strlen ( self :: $ auto_prefix_models ) ) == self :: $ auto_prefix_models ) { $ model_name = substr ( $ model_name , strlen ( self :: $ auto_prefix_models ) , strlen ( $ model_name ) ) ; } $ class_names = [ $ model_name , $ associated_class_name ] ; sort ( $ class_names , SORT_STRING ) ; $ join_class_name = join ( "" , $ class_names ) ; } // Get table names for each class $ base_table_name = self :: _getTableName ( $ base_class_name ) ; $ associated_table_name = self :: _getTableName ( self :: $ auto_prefix_models . $ associated_class_name ) ; $ join_table_name = self :: _getTableName ( self :: $ auto_prefix_models . $ join_class_name ) ; // Get ID column names $ base_table_id_column = ( is_null ( $ key_in_base_table ) ) ? self :: _getIdColumnName ( $ base_class_name ) : $ key_in_base_table ; $ associated_table_id_column = ( is_null ( $ key_in_associated_table ) ) ? self :: _getIdColumnName ( 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 :: _buildForeignKeyName ( $ key_to_base_table , $ base_table_name ) ; $ key_to_associated_table = self :: _buildForeignKeyName ( $ 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 , [ "{$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 ) ; }
Helper method to manage many-to-many relationships via an intermediate model. See
README for a full explanation of the parameters.

@param  string      $associated_class_name
@param  null|string $join_class_name
@param  null|string $key_to_base_table
@param  null|string $key_to_associated_table
@param  null|string $key_in_base_table
@param  null|string $key_in_associated_table
@param  null|string $connection_name
@return OneWrapper
Helper method to manage many - to - many relationships via an intermediate model . See README for a full explanation of the parameters .