src/bundles/Database/Model.php
public static function with( $with, $callback = null ) 
	{	
		if ( !is_array( $with ) )
		{
			$with = array( $with );
		}
		
		$settings = static::_model();
		
		$query = DB::select( $settings['table'] );
		
		// run the callback
		if ( !is_null( $callback ) )
		{
			call_user_func_array( $callback, array( &$query ) );
		}
		
		// alway group the result and fetch assoc
		$query->forward_key( $settings['primary_key'] );
		$query->fetch_arguments = array( 'assoc' );
		
		// get the main result set
		$results = static::assign( $query->run() );
		$singleton = false;
		
		if ( !is_array( $results ) )
		{
			$results = array( $results );
			$singleton = true;
		}
		
		$ref_object = reset( $results );
		
		// we have to sort the relationships to make sure that
		// select the relations in the right order.	
		asort( $with );
		
		foreach( $with as $relation => $callback )
		{
			if ( is_int( $relation ) && is_string( $callback ) )
			{
				$relation = $callback;
				$callback = null;
			}
			
			if ( strpos( $relation, '.' ) !== false )
			{	
				$relation_layers = explode( '.', $relation );
				
				$relation_name = array_pop( $relation_layers );
				
				$relation_collection = array();
				
				foreach( $results as $key => &$item )
				{
					$curr_item = $item;
					
					foreach( $relation_layers as $layer )
					{
						$curr_item = $curr_item->raw( $layer );
					}
					
					$relation_collection[] = $curr_item;
				}
				
				$ref_object = reset( $relation_collection );
				
				$relation_object = call_user_func( array( $ref_object, $relation_name ) );
				if ( $relation_object instanceof Model_Relation )
				{
					$relation_object->collection_assign( $relation_name, $relation_collection, $callback );
				}
			}
			else
			{
				$relation_object = call_user_func( array( $ref_object, $relation ) );
				if ( $relation_object instanceof Model_Relation )
				{
					$relation_object->collection_assign( $relation, $results, $callback );
				}
				
			}
		}
		
		if ( $singleton )
		{
			return reset( $results );
		}
		
		// and assign
		return $results;
	}
public static function with( $with, $callback = null ) 
	{	
		if ( !is_array( $with ) )
		{
			$with = array( $with );
		}
		
		$settings = static::_model();
		
		$query = DB::select( $settings['table'] );
		
		// run the callback
		if ( !is_null( $callback ) )
		{
			call_user_func_array( $callback, array( &$query ) );
		}
		
		// alway group the result and fetch assoc
		$query->forward_key( $settings['primary_key'] );
		$query->fetch_arguments = array( 'assoc' );
		
		// get the main result set
		$results = static::assign( $query->run() );
		$singleton = false;
		
		if ( !is_array( $results ) )
		{
			$results = array( $results );
			$singleton = true;
		}
		
		$ref_object = reset( $results );
		
		// we have to sort the relationships to make sure that
		// select the relations in the right order.	
		asort( $with );
		
		foreach( $with as $relation => $callback )
		{
			if ( is_int( $relation ) && is_string( $callback ) )
			{
				$relation = $callback;
				$callback = null;
			}
			
			if ( strpos( $relation, '.' ) !== false )
			{	
				$relation_layers = explode( '.', $relation );
				
				$relation_name = array_pop( $relation_layers );
				
				$relation_collection = array();
				
				foreach( $results as $key => &$item )
				{
					$curr_item = $item;
					
					foreach( $relation_layers as $layer )
					{
						$curr_item = $curr_item->raw( $layer );
					}
					
					$relation_collection[] = $curr_item;
				}
				
				$ref_object = reset( $relation_collection );
				
				$relation_object = call_user_func( array( $ref_object, $relation_name ) );
				if ( $relation_object instanceof Model_Relation )
				{
					$relation_object->collection_assign( $relation_name, $relation_collection, $callback );
				}
			}
			else
			{
				$relation_object = call_user_func( array( $ref_object, $relation ) );
				if ( $relation_object instanceof Model_Relation )
				{
					$relation_object->collection_assign( $relation, $results, $callback );
				}
				
			}
		}
		
		if ( $singleton )
		{
			return reset( $results );
		}
		
		// and assign
		return $results;
	}
public static function with ( $ with , $ callback = null ) { if ( ! is_array ( $ with ) ) { $ with = array ( $ with ) ; } $ settings = static :: _model ( ) ; $ query = DB :: select ( $ settings [ 'table' ] ) ; // run the callback if ( ! is_null ( $ callback ) ) { call_user_func_array ( $ callback , array ( & $ query ) ) ; } // alway group the result and fetch assoc $ query -> forward_key ( $ settings [ 'primary_key' ] ) ; $ query -> fetch_arguments = array ( 'assoc' ) ; // get the main result set $ results = static :: assign ( $ query -> run ( ) ) ; $ singleton = false ; if ( ! is_array ( $ results ) ) { $ results = array ( $ results ) ; $ singleton = true ; } $ ref_object = reset ( $ results ) ; // we have to sort the relationships to make sure that // select the relations in the right order.	 asort ( $ with ) ; foreach ( $ with as $ relation => $ callback ) { if ( is_int ( $ relation ) && is_string ( $ callback ) ) { $ relation = $ callback ; $ callback = null ; } if ( strpos ( $ relation , '.' ) !== false ) { $ relation_layers = explode ( '.' , $ relation ) ; $ relation_name = array_pop ( $ relation_layers ) ; $ relation_collection = array ( ) ; foreach ( $ results as $ key => & $ item ) { $ curr_item = $ item ; foreach ( $ relation_layers as $ layer ) { $ curr_item = $ curr_item -> raw ( $ layer ) ; } $ relation_collection [ ] = $ curr_item ; } $ ref_object = reset ( $ relation_collection ) ; $ relation_object = call_user_func ( array ( $ ref_object , $ relation_name ) ) ; if ( $ relation_object instanceof Model_Relation ) { $ relation_object -> collection_assign ( $ relation_name , $ relation_collection , $ callback ) ; } } else { $ relation_object = call_user_func ( array ( $ ref_object , $ relation ) ) ; if ( $ relation_object instanceof Model_Relation ) { $ relation_object -> collection_assign ( $ relation , $ results , $ callback ) ; } } } if ( $ singleton ) { return reset ( $ results ) ; } // and assign return $ results ; }
find with an relationship

Person::with( 'cars' );

@param array|string 			$with
@param callback				$callback
@return array
find with an relationship