123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- <?php namespace System\DB\Eloquent;
- class Hydrator {
-
- public static function hydrate($eloquent)
- {
-
-
-
- $results = static::base(get_class($eloquent), $eloquent->query->get());
-
-
-
- if (count($results) > 0)
- {
- foreach ($eloquent->includes as $include)
- {
- if ( ! method_exists($eloquent, $include))
- {
- throw new \Exception("Attempting to eager load [$include], but the relationship is not defined.");
- }
- static::eagerly($eloquent, $include, $results);
- }
- }
- return $results;
- }
-
- private static function base($class, $results)
- {
- $models = array();
- foreach ($results as $result)
- {
- $model = new $class;
-
-
-
- $model->attributes = (array) $result;
- $model->exists = true;
-
-
-
- $models[$model->id] = $model;
- }
- return $models;
- }
-
- private static function eagerly($eloquent, $include, &$results)
- {
-
-
-
-
-
-
- $eloquent->attributes[$spoof = $include.'_id'] = 0;
- $model = $eloquent->$include();
- unset($eloquent->attributes[$spoof]);
-
-
-
- $model->query->where = 'WHERE 1 = 1';
- $model->query->bindings = array();
-
-
-
- foreach ($results as &$result)
- {
- $result->ignore[$include] = (strpos($eloquent->relating, 'has_many') === 0) ? array() : null;
- }
-
-
-
- if ($eloquent->relating == 'has_one' or $eloquent->relating == 'has_many')
- {
- static::eagerly_load_one_or_many($eloquent->relating_key, $eloquent->relating, $include, $model, $results);
- }
- elseif ($eloquent->relating == 'belongs_to')
- {
- static::eagerly_load_belonging($eloquent->relating_key, $include, $model, $results);
- }
- else
- {
- static::eagerly_load_many_to_many($eloquent->relating_key, $eloquent->relating_table, strtolower(get_class($eloquent)).'_id', $include, $model, $results);
- }
- }
-
- private static function eagerly_load_one_or_many($relating_key, $relating, $include, $model, &$results)
- {
-
-
-
- $inclusions = $model->where_in($relating_key, array_keys($results))->get();
-
-
-
- foreach ($inclusions as $key => $inclusion)
- {
- if ($relating == 'has_one')
- {
- $results[$inclusion->$relating_key]->ignore[$include] = $inclusion;
- }
- else
- {
- $results[$inclusion->$relating_key]->ignore[$include][$inclusion->id] = $inclusion;
- }
- }
- }
-
- private static function eagerly_load_belonging($relating_key, $include, $model, &$results)
- {
-
-
-
- $keys = array();
- foreach ($results as &$result)
- {
- $keys[] = $result->$relating_key;
- }
-
-
-
- $inclusions = $model->where_in('id', array_unique($keys))->get();
-
-
-
- foreach ($results as &$result)
- {
- $result->ignore[$include] = $inclusions[$result->$relating_key];
- }
- }
-
- private static function eagerly_load_many_to_many($relating_key, $relating_table, $foreign_key, $include, $model, &$results)
- {
-
-
-
- $model->query->select = null;
-
-
-
-
-
-
- $inclusions = $model->query
- ->where_in($relating_key, array_keys($results))
- ->get(\System\DB\Eloquent::table(get_class($model)).'.*', $relating_table.'.'.$foreign_key);
-
-
-
- $class = get_class($model);
-
-
-
- foreach ($inclusions as $inclusion)
- {
- $related = new $class;
-
-
-
- $related->exists = true;
- $related->attributes = (array) $inclusion;
-
-
-
-
- unset($related->attributes[$foreign_key]);
-
-
-
- $results[$inclusion->$foreign_key]->ignore[$include][$inclusion->id] = $related;
- }
- }
- }
|