You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 创建仅存储单条数据的企业信息表的最佳实践咨询

单条企业信息存储场景的最佳实现方案

你当前的迁移仅完成了基础字段定义,没有做单条数据的写入限制,存在误插入多条冗余数据的风险,可按以下方案优化:

1. 优化迁移文件

从数据库层面强制限制仅能存储1条数据,移除无用的自增ID,新增固定ID约束:

class CreateEnterpriseInfosTable extends Migration
{
    /**
     * 运行迁移
     *
     * @return void
     */
    public function up()
    {
        Schema::create('enterprise_infos', function (Blueprint $table) {
            // 固定ID为1,作为唯一主键
            $table->tinyInteger('id')->primary()->default(1);
            $table->string('name', 50);
            $table->string('street_address', 50);
            $table->string('postal_address', 50);
            $table->string('phone', 17);
            $table->string('fax', 17);
            $table->string('logo_path', 50);
            $table->timestamps();

            // 数据库层面约束:仅允许ID为1的记录存在
            $table->check('id = 1');
        });
    }

    /**
     * 回滚迁移
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('enterprise_infos');
    }
}

如果使用的MySQL版本低于8.0.16不支持check约束,可以省略check语句,配合下面的模型层限制也可达到相同效果。

2. 封装模型层逻辑

在模型层面做二次校验,避免业务代码误写入多条数据,同时封装快捷访问方法:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class EnterpriseInfo extends Model
{
    protected $fillable = [
        'name', 'street_address', 'postal_address', 'phone', 'fax', 'logo_path'
    ];

    /**
     * 模型启动时注册事件监听
     */
    protected static function booted()
    {
        // 创建数据时强制指定ID为1
        static::creating(function ($model) {
            $model->id = 1;
        });
    }

    /**
     * 全局快捷获取企业信息方法
     */
    public static function getInfo()
    {
        return self::firstOr(function () {
            return self::create([]);
        });
    }

    /**
     * 重写保存方法,固定ID避免冗余数据
     */
    public function save(array $options = [])
    {
        $this->id = 1;
        return parent::save($options);
    }
}

业务中读取企业信息直接调用EnterpriseInfo::getInfo()即可,更新时直接调用该实例的update方法即可。

3. 补充初始化数据(可选)

可以创建填充器,在项目部署时自动初始化一条空的企业信息记录,避免业务中首次调用判断记录是否存在:

<?php

namespace Database\Seeders;

use App\Models\EnterpriseInfo;
use Illuminate\Database\Seeder;

class EnterpriseInfoSeeder extends Seeder
{
    public function run()
    {
        EnterpriseInfo::firstOrCreate(
            ['id' => 1],
            [
                'name' => '默认企业名称',
                // 其余字段默认值按需配置
            ]
        );
    }
}

内容的提问来源于stack exchange,提问作者Achraf Ben Soltane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 01:54:05