📜  laravel 自定义模型主键 - PHP (1)

📅  最后修改于: 2023-12-03 15:32:35.874000             🧑  作者: Mango

Laravel 自定义模型主键

Laravel 默认使用 id 字段作为模型主键,但是有时候我们需要使用自己定义的主键名,本文将介绍如何在 Laravel 中自定义模型主键。

使用自定义主键名

要使用自定义主键名,我们需要在模型中声明 $primaryKey 属性,并指定我们希望使用的主键名。例如,如果我们想使用名为 email 的字段作为主键:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The primary key for the model.
     *
     * @var string
     */
    protected $primaryKey = 'email';
}

如果我们现在执行 User::find('example@example.com'),Laravel 将会使用 example@example.com 作为主键进行查找。

非数字主键

如果我们使用的是非数字主键,需要在模型中的 $keyType 属性指定主键类型为 string,以避免 Laravel 将主键视为数值进行处理。例如:

/**
 * The primary key data type.
 *
 * @var string
 */
protected $keyType = 'string';
自增主键

如果我们使用的主键是自增类型,可以在模型中设置 $incrementing 属性为 false,并实现自定义的 incrementdecrement 方法。例如,如果我们使用名为 UUID 的字段作为自增主键:

/**
 * Indicates if the IDs are auto-incrementing.
 *
 * @var bool
 */
public $incrementing = false;

/**
 * Increment the model's UUID.
 *
 * @param  int  $value
 * @param  string  $field
 * @return int
 */
public function increment($value = 1, $field = 'UUID')
{
    $this->{$field} = Str::uuid();
    
    return $this->save() ? $this->{$field} : false;
}

/**
 * Decrement the model's UUID.
 *
 * @param  int  $value
 * @param  string  $field
 * @return int
 */
public function decrement($value = 1, $field = 'UUID')
{
    throw new \LogicException('Cannot decrement UUID.');
}

现在我们可以通过调用 increment 方法来新增记录,并生成一个新的 UUID 作为主键值,例如:$user->increment();

总结

Laravel 中可以很方便地自定义模型主键,我们可以在模型中设置 $primaryKey$keyType$incrementing 等属性,以实现自己的需求。