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
相关产品推荐
相关产品推荐

