97 lines
2.4 KiB
PHP
97 lines
2.4 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Illuminate\Database\Eloquent\Concerns;
|
||
|
|
||
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||
|
use Illuminate\Support\Str;
|
||
|
|
||
|
trait HasUlids
|
||
|
{
|
||
|
/**
|
||
|
* Boot the trait.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function bootHasUlids()
|
||
|
{
|
||
|
static::creating(function (self $model) {
|
||
|
foreach ($model->uniqueIds() as $column) {
|
||
|
if (empty($model->{$column})) {
|
||
|
$model->{$column} = $model->newUniqueId();
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generate a new ULID for the model.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function newUniqueId()
|
||
|
{
|
||
|
return strtolower((string) Str::ulid());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retrieve the model for a bound value.
|
||
|
*
|
||
|
* @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation $query
|
||
|
* @param mixed $value
|
||
|
* @param string|null $field
|
||
|
* @return \Illuminate\Database\Eloquent\Relations\Relation
|
||
|
*
|
||
|
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
|
||
|
*/
|
||
|
public function resolveRouteBindingQuery($query, $value, $field = null)
|
||
|
{
|
||
|
if ($field && in_array($field, $this->uniqueIds()) && ! Str::isUlid($value)) {
|
||
|
throw (new ModelNotFoundException)->setModel(get_class($this), $value);
|
||
|
}
|
||
|
|
||
|
if (! $field && in_array($this->getRouteKeyName(), $this->uniqueIds()) && ! Str::isUlid($value)) {
|
||
|
throw (new ModelNotFoundException)->setModel(get_class($this), $value);
|
||
|
}
|
||
|
|
||
|
return parent::resolveRouteBindingQuery($query, $value, $field);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the columns that should receive a unique identifier.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function uniqueIds()
|
||
|
{
|
||
|
return [$this->getKeyName()];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the auto-incrementing key type.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getKeyType()
|
||
|
{
|
||
|
if (in_array($this->getKeyName(), $this->uniqueIds())) {
|
||
|
return 'string';
|
||
|
}
|
||
|
|
||
|
return $this->keyType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the value indicating whether the IDs are incrementing.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function getIncrementing()
|
||
|
{
|
||
|
if (in_array($this->getKeyName(), $this->uniqueIds())) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $this->incrementing;
|
||
|
}
|
||
|
}
|