Commit 6234905e by Taylor Otwell

Merge branch 'develop' into feature/http-foundation

parents 9e8acd1e 3e0d4684
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Laravel - A PHP Framework For Web Artisans * Laravel - A PHP Framework For Web Artisans
* *
* @package Laravel * @package Laravel
* @version 3.1.1 * @version 3.1.2
* @author Taylor Otwell <taylorotwell@gmail.com> * @author Taylor Otwell <taylorotwell@gmail.com>
* @link http://laravel.com * @link http://laravel.com
*/ */
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
- [Laravel 3.2](#3.2) - [Laravel 3.2](#3.2)
- [Upgrading From 3.1](#upgrade-3.2) - [Upgrading From 3.1](#upgrade-3.2)
- [Laravel 3.1.2](#3.1.2)
- [Upgrading From 3.1.1](#upgrade-3.1.2)
- [Laravel 3.1.1](#3.1.1) - [Laravel 3.1.1](#3.1.1)
- [Upgrading From 3.1](#upgrade-3.1.1) - [Upgrading From 3.1](#upgrade-3.1.1)
- [Laravel 3.1](#3.1) - [Laravel 3.1](#3.1)
...@@ -12,12 +14,27 @@ ...@@ -12,12 +14,27 @@
<a name="3.2"></a> <a name="3.2"></a>
## Laravel 3.2 ## Laravel 3.2
- Fixed the passing of strings into the Input::except method.
- Fixed replacement of optional parameters in URL::transpose method. - Fixed replacement of optional parameters in URL::transpose method.
- Added "to_array" method to the base Eloquent model.
- Added "$hidden" static variable to the base Eloquent model.
- Added "sync" method to has_many_and_belongs_to Eloquent relationship.
<a name="upgrade-3.2"></a> <a name="upgrade-3.2"></a>
## Upgrading From 3.1 ## Upgrading From 3.1
- Replace the **laravel** folder. - Replace the **laravel** folder.
- Add new **vendors** folder.
<a name="3.1.2"></a>
## Laravel 3.1.2
- Fixes Eloquent query method constructor conflict.
<a name="upgrade-3.1.2"></a>
## Upgrade From 3.1.1
- Replace the **laravel** folder.
<a name="3.1.1"></a> <a name="3.1.1"></a>
## Laravel 3.1.1 ## Laravel 3.1.1
...@@ -86,6 +103,7 @@ If you have created indexes on tables using the Laravel migration system and you ...@@ -86,6 +103,7 @@ If you have created indexes on tables using the Laravel migration system and you
Add the following to the **aliases** array in your **application/config/application.php** file: Add the following to the **aliases** array in your **application/config/application.php** file:
'Eloquent' => 'Laravel\\Database\\Eloquent\\Model', 'Eloquent' => 'Laravel\\Database\\Eloquent\\Model',
'Blade' => 'Laravel\\Blade',
### Update Eloquent many-to-many tables. ### Update Eloquent many-to-many tables.
...@@ -101,4 +119,16 @@ English pluralization and singularization is now automatic. Just completely repl ...@@ -101,4 +119,16 @@ English pluralization and singularization is now automatic. Just completely repl
### Add the **fetch** option to your database configuration file. ### Add the **fetch** option to your database configuration file.
A new **fetch** option allows you to specify in which format you receive your database results. Just copy and paste the option from the new **application/config/database.php** file. A new **fetch** option allows you to specify in which format you receive your database results. Just copy and paste the option from the new **application/config/database.php** file.
\ No newline at end of file
### Add **database** option to your Redis configuration.
If you are using Redis, add the "database" option to your Redis connection configurations. The "database" value can be zero by default.
'redis' => array(
'default' => array(
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0
),
),
...@@ -56,6 +56,13 @@ abstract class Model { ...@@ -56,6 +56,13 @@ abstract class Model {
public static $accessible; public static $accessible;
/** /**
* The attributes that should be excluded from to_array.
*
* @var array
*/
public static $hidden = array();
/**
* Indicates if the model has update and creation timestamps. * Indicates if the model has update and creation timestamps.
* *
* @var bool * @var bool
...@@ -521,6 +528,51 @@ abstract class Model { ...@@ -521,6 +528,51 @@ abstract class Model {
} }
/** /**
* Get the model attributes and relationships in array form.
*
* @return array
*/
public function to_array()
{
$attributes = array();
// First we need to gather all of the regular attributes. If the attribute
// exists in the array of "hidden" attributes, it will not be added to
// the array so we can easily exclude things like passwords, etc.
foreach (array_keys($this->attributes) as $attribute)
{
if ( ! in_array($attribute, static::$hidden))
{
$attributes[$attribute] = $this->$attribute;
}
}
foreach ($this->relationships as $name => $models)
{
// If the relationship is not a "to-many" relationship, we can just
// to_array the related model and add it as an attribute to the
// array of existing regular attributes we gathered.
if ( ! is_array($models))
{
$attributes[$name] = $models->to_array();
}
// If the relationship is a "to-many" relationship we need to spin
// through each of the related models and add each one with the
// to_array method, keying them both by name and ID.
else
{
foreach ($models as $id => $model)
{
$attributes[$name][$id] = $model->to_array();
}
}
}
return $attributes;
}
/**
* Handle the dynamic retrieval of attributes and associations. * Handle the dynamic retrieval of attributes and associations.
* *
* @param string $key * @param string $key
...@@ -610,10 +662,12 @@ abstract class Model { ...@@ -610,10 +662,12 @@ abstract class Model {
*/ */
public function __call($method, $parameters) public function __call($method, $parameters)
{ {
$meta = array('key', 'table', 'connection', 'sequence', 'per_page');
// If the method is actually the name of a static property on the model we'll // If the method is actually the name of a static property on the model we'll
// return the value of the static property. This makes it convenient for // return the value of the static property. This makes it convenient for
// relationships to access these values off of the instances. // relationships to access these values off of the instances.
if (in_array($method, array('key', 'table', 'connection', 'sequence', 'per_page'))) if (in_array($method, $meta))
{ {
return static::$$method; return static::$$method;
} }
......
...@@ -43,7 +43,7 @@ class Query { ...@@ -43,7 +43,7 @@ class Query {
{ {
$this->model = ($model instanceof Model) ? $model : new $model; $this->model = ($model instanceof Model) ? $model : new $model;
$this->table = $this->query(); $this->table = $this->table();
} }
/** /**
...@@ -183,7 +183,7 @@ class Query { ...@@ -183,7 +183,7 @@ class Query {
$query->table->where_nested($constraints); $query->table->where_nested($constraints);
} }
// Before matching the models, we will initialize the relationship // Before matching the models, we will initialize the relationships
// to either null for single-value relationships or an array for // to either null for single-value relationships or an array for
// the multi-value relationships as their baseline value. // the multi-value relationships as their baseline value.
$query->initialize($results, $relationship); $query->initialize($results, $relationship);
...@@ -245,7 +245,7 @@ class Query { ...@@ -245,7 +245,7 @@ class Query {
* *
* @return Query * @return Query
*/ */
protected function query() protected function table()
{ {
return $this->connection()->table($this->model->table()); return $this->connection()->table($this->model->table());
} }
......
...@@ -87,6 +87,51 @@ class Has_Many_And_Belongs_To extends Relationship { ...@@ -87,6 +87,51 @@ class Has_Many_And_Belongs_To extends Relationship {
} }
/** /**
* Detach a record from the joining table of the association.
*
* @param int $ids
* @return bool
*/
public function detach($ids)
{
if ( ! is_array($ids)) $ids = array($ids);
return $this->pivot()->where_in($this->other_key(), $ids)->delete();
}
/**
* Sync the joining table with the array of given IDs.
*
* @param array $ids
* @return bool
*/
public function sync($ids)
{
$current = $this->pivot()->lists($this->other_key());
// First we need to attach any of the associated models that are not currently
// in the joining table. We'll spin through the given IDs, checking to see
// if they exist in the array of current ones, and if not we insert.
foreach ($ids as $id)
{
if ( ! in_array($id, $current))
{
$this->attach($id);
}
}
// Next we will take the difference of the current and given IDs and detach
// all of the entities that exists in the current array but are not in
// the array of IDs given to the method, finishing the sync.
$detach = array_diff($current, $ids);
if (count($detach) > 0)
{
$this->detach(array_diff($current, $ids));
}
}
/**
* Insert a new record for the association. * Insert a new record for the association.
* *
* @param Model|array $attributes * @param Model|array $attributes
...@@ -194,7 +239,7 @@ class Has_Many_And_Belongs_To extends Relationship { ...@@ -194,7 +239,7 @@ class Has_Many_And_Belongs_To extends Relationship {
$this->with = array_merge($this->with, array($foreign, $other)); $this->with = array_merge($this->with, array($foreign, $other));
// Since pivot tables may have extra information on them that the developer // Since pivot tables may have extra information on them that the developer
// needs, we allow an extra array of columns to be specified that will be // needs we allow an extra array of columns to be specified that will be
// fetched from the pivot table and hydrate into the pivot model. // fetched from the pivot table and hydrate into the pivot model.
foreach ($this->with as $column) foreach ($this->with as $column)
{ {
...@@ -269,9 +314,14 @@ class Has_Many_And_Belongs_To extends Relationship { ...@@ -269,9 +314,14 @@ class Has_Many_And_Belongs_To extends Relationship {
{ {
$foreign = $this->foreign_key(); $foreign = $this->foreign_key();
// For each child we'll just get the parent that connects to the child and set the
// child model on the relationship array using the keys. Once we're done looping
// through the children all of the proper relations will be set.
foreach ($children as $key => $child) foreach ($children as $key => $child)
{ {
$parents[$child->pivot->$foreign]->relationships[$relationship][$child->{$child->key()}] = $child; $parent =& $parents[$child->pivot->$foreign];
$parent->relationships[$relationship][$child->{$child->key()}] = $child;
} }
} }
...@@ -292,7 +342,7 @@ class Has_Many_And_Belongs_To extends Relationship { ...@@ -292,7 +342,7 @@ class Has_Many_And_Belongs_To extends Relationship {
// If the attribute key starts with "pivot_", we know this is a column on // If the attribute key starts with "pivot_", we know this is a column on
// the pivot table, so we will move it to the Pivot model and purge it // the pivot table, so we will move it to the Pivot model and purge it
// from the model since it actually belongs to the pivot. // from the model since it actually belongs to the pivot model.
foreach ($result->attributes as $key => $value) foreach ($result->attributes as $key => $value)
{ {
if (starts_with($key, 'pivot_')) if (starts_with($key, 'pivot_'))
...@@ -322,9 +372,9 @@ class Has_Many_And_Belongs_To extends Relationship { ...@@ -322,9 +372,9 @@ class Has_Many_And_Belongs_To extends Relationship {
{ {
$columns = (is_array($columns)) ? $columns : func_get_args(); $columns = (is_array($columns)) ? $columns : func_get_args();
// The "with" array contains a couple of columns by default, so we will // The "with" array contains a couple of columns by default, so we will just
// just merge in the developer specified columns here, and we'll make // merge in the developer specified columns here, and we will make sure
// sure the values of the array are unique. // the values of the array are unique to avoid duplicates.
$this->with = array_unique(array_merge($this->with, $columns)); $this->with = array_unique(array_merge($this->with, $columns));
$this->set_select($this->foreign_key(), $this->other_key()); $this->set_select($this->foreign_key(), $this->other_key());
......
...@@ -51,7 +51,7 @@ abstract class Relationship extends Query { ...@@ -51,7 +51,7 @@ abstract class Relationship extends Query {
// Next we'll set the fluent query builder for the relationship and // Next we'll set the fluent query builder for the relationship and
// constrain the query such that it only returns the models that // constrain the query such that it only returns the models that
// are appropriate for the relationship. // are appropriate for the relationship.
$this->table = $this->query(); $this->table = $this->table();
$this->constrain(); $this->constrain();
} }
......
...@@ -120,7 +120,7 @@ class Input { ...@@ -120,7 +120,7 @@ class Input {
*/ */
public static function except($keys) public static function except($keys)
{ {
return array_diff_key(static::get(), array_flip($keys)); return array_diff_key(static::get(), array_flip((array) $keys));
} }
/** /**
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Laravel - A PHP Framework For Web Artisans * Laravel - A PHP Framework For Web Artisans
* *
* @package Laravel * @package Laravel
* @version 3.1.1 * @version 3.1.2
* @author Taylor Otwell <taylorotwell@gmail.com> * @author Taylor Otwell <taylorotwell@gmail.com>
* @link http://laravel.com * @link http://laravel.com
*/ */
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Laravel - A PHP Framework For Web Artisans * Laravel - A PHP Framework For Web Artisans
* *
* @package Laravel * @package Laravel
* @version 3.1.1 * @version 3.1.2
* @author Taylor Otwell <taylorotwell@gmail.com> * @author Taylor Otwell <taylorotwell@gmail.com>
* @link http://laravel.com * @link http://laravel.com
*/ */
...@@ -31,4 +31,4 @@ unset($web); ...@@ -31,4 +31,4 @@ unset($web);
// -------------------------------------------------------------- // --------------------------------------------------------------
// Launch Laravel. // Launch Laravel.
// -------------------------------------------------------------- // --------------------------------------------------------------
require path('sys').'laravel.php'; require path('sys').'laravel.php';
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment