📜  laravel 唯一列除了 self - PHP (1)

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

Laravel 唯一列除了 self

在 Laravel 中,我们可以使用唯一列来防止重复插入,保证数据表中的每条记录都是唯一的。常见的做法是在数据表中添加一个唯一索引,然后在插入数据时捕获唯一键冲突的异常。

不过,如果我们需要让某个字段在插入数据时唯一,但又希望这个字段能够包含当前记录的 ID 值(即自己),该怎么办呢?Laravel 提供了一个很方便的解决方案。

方案

在数据表中,我们可以使用 UNIQUE 索引来为字段添加唯一约束。但是,如果我们希望这个字段能够包含当前记录的 ID 值,就需要使用复合唯一索引来解决问题。具体来说,我们需要在该字段和 ID 字段上建立一个复合唯一索引,如下所示:

ALTER TABLE `my_table` ADD UNIQUE `unique_column_and_id` (`column`, `id`);

其中,my_table 是数据表名称,column 是需要唯一的字段名,id 是自增 ID 字段名。

完成索引的设置后,我们还需要在模型中定义一个 $incrementing 值为 false 的属性,并在保存新记录前手动指定 ID 值。

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model
{
    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

    /**
     * Create a new record with a specified ID.
     *
     * @param  array  $attributes
     * @param  bool  $massAssignment
     * @return static
     */
    public static function createWithId($attributes, $massAssignment = true)
    {
        $model = new static;

        if ($massAssignment) {
            $model->fill($attributes)->save();
        } else {
            $model->forceFill($attributes)->save();
        }

        return $model;
    }
}

然后,在创建新记录时,我们就可以指定 ID 值,实现唯一约束。

MyModel::createWithId([
    'column' => 'value',
    'id' => 12345,
]);
总结

使用复合索引可以帮助我们实现某个字段除自己之外的唯一约束。虽然在 Laravel 中没有直接的支持,但我们可以通过定义模型属性和方法来方便地实现该功能。