Skip to content

Instantly share code, notes, and snippets.

@minedun6
Forked from danken00/model.php
Created January 27, 2017 18:27
Show Gist options
  • Save minedun6/cd35180ea90bf49ecbdb8513d414930c to your computer and use it in GitHub Desktop.
Save minedun6/cd35180ea90bf49ecbdb8513d414930c to your computer and use it in GitHub Desktop.
Laravel 5 model casting function
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Illuminate\Database\Eloquent\Model as IlluminateModel;
use Illuminate\Pagination\AbstractPaginator;
class Model extends IlluminateModel
{
/**
* Casts a given array or collection to this model class if it isn't
* already
*
* @param mixed $results Collection/array/pagintor to cast
* @return mixed EloquentCollection or pagination object depending
* on what was passed in
*/
static function castResults($results)
{
// If the object being passed in is a paginator, let's create
// another paginator with the updated results
$isPaginator = is_a($results, AbstractPaginator::class);
$resultsToCast = $isPaginator ? $results->items() : $results;
// Item is an array. Check to make sure each item within that array
// is of the correct type, and cast if not
if (is_array($resultsToCast))
{
$castResults = new EloquentCollection();
foreach ($resultsToCast as $objectToCast)
{
if (!is_a($objectToCast, self::class))
{
$castResults->push((new static)->newFromBuilder($objectToCast));
}
else
{
$castResults->push($objectToCast);
}
}
}
else
{
$castResults = $resultsToCast;
}
// If the original object was a paginator, then re-create it as
// best we can
if ($isPaginator)
{
$paginatorClass = get_class($results);
$newPaginator = new $paginatorClass($castResults, $results->total(), $results->perPage(), $results->currentPage());
$newPaginator->setPath($results->resolveCurrentPath());
return $newPaginator;
}
else
{
return $castResults;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment