2025年8月

Eloquent是laravel中用来实数据库模型化的工具,使用eloquent生成模型类,与数据表形成映射关系,之后在操作数据库时就不需要手工进行数据的边接和查义语句的编写,只需写php对模型类进行操作即可。

那么在laravel中,当我们在.env中配置好数据库后,laravel是否会自动生成建议映射并生成模型文件呢? 答案是不会的。

了解这个问题,其实就是了解Eloquent的工作过程。

通常情况下,你需要手工使用Artisan命令来生成Model,但这个命令可以非常智能地根据你的数据表结构进行“适配”,而不是完全“自动生成”。

系统不会在你创建数据表迁移后自动为你创建模型。你需要手动执行一个命令来创建模型文件,然后可以手动或利用命令选项来让它与特定的数据表关联。

 

核心概念:为什么不是全自动?

Laravel 遵循 “约定优于配置” 的原则。如果你遵循它的约定,几乎不需要额外配置。

模型命名约定:模型类名的单数、大驼峰形式对应数据表名的复数、蛇形命名。

例如:模型 Flight 会自动对应到数据表 flights。

模型 UserProfile 会自动对应到数据表 user_profiles。

主键约定:默认每张表的主键是 id,且是自增的整数。

时间戳约定:默认期望存在 created_at 和 updated_at 两个时间戳字段。

如果你遵循了这些约定,你只需要生成一个空的模型,它就能自动工作。如果你没有遵循约定,则需要在模型文件中手动指定表名、主键等属性。

如果我们有一个posts表,那么执行php artisan make:model Post即可app/Models/ 目录下生成 Post.php 文件。

 

高级技巧:一站式生成
Laravel 的 Artisan 命令非常强大,可以让你在创建模型的同时顺便创建迁移、控制器等资源,大大提高效率。

最常用的组合命令:

bash
php artisan make:model Post -mcr
-m 或 --migration:同时为模型创建一个迁移文件 (create_posts_table)。

-c 或 --controller:同时创建一个资源控制器 (PostController)。

-r 或 --resource:指示控制器应该是资源控制器(包含 index, create, store, show, edit, update, destroy 等方法)。

执行上面的命令后,你会一次性得到:

模型文件 app/Models/Post.php

迁移文件 database/migrations/xxxx_create_posts_table.php

控制器文件 app/Http/Controllers/PostController.php

然后你只需要去编辑迁移文件来定义表结构,再运行 php artisan migrate 即可。

建立好模型类文件,就可以在控制器或者路由中使用它了。

Migration 的核心作用是在多人协作中,像使用版本控制器(如 Git)管理代码一样来管理你的数据库,从而避免使用sql脚本文件的互传。

它允许你和你的团队在应用中定义、共享和维护数据库结构的变化,确保所有开发人员、测试服务器和生产服务器的数据库结构始终保持一致。

在没有迁移功能之前,团队协作开发时,数据库结构的管理通常非常麻烦:

开发者A 在本地数据库添加了一个新表或新字段。

开发者B 也需要进行同样的修改,他需要手动执行 SQL 语句或从A那里获取SQL脚本。

很容易出错,或者忘记执行某个修改,导致代码运行失败。

部署到生产环境时,DBA 或运维人员需要根据开发的变化,手动整理和执行SQL脚本,过程繁琐且易遗漏。


Migration 完美地解决了这些问题:

1. 版本化与协同工作
每个迁移文件通常代表一次数据库结构的更改(例如:create_users_table, add_votes_to_users_table)。

这些文件被放在项目的 database/migrations/ 目录下,可以纳入版本控制系统(如 Git)。

当其他开发者拉取(pull)你的代码后,只需要运行一条命令 php artisan migrate,Laravel 就会自动执行他们本地尚未运行过的迁移文件,使他们的数据库结构立刻与你的一致。

2. 数据库无关性
迁移让你可以使用 PHP 代码 和 流畅的、富有表现力的语法 来定义数据表结构,而不是原生的 SQL。

Laravel 的 Schema 构建器支持所有主流数据库系统(MySQL, PostgreSQL, SQLite, SQL Server)。

这意味着你写一套迁移代码,可以无缝地在不同的数据库驱动上运行,无需为不同数据库编写不同的 SQL 脚本。

示例:创建一个 flights 表

php
// database/migrations/2024_08_19_000000_create_flights_table.php
public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->id(); // 自增 ID,主键
        $table->string('name');
        $table->string('airline');
        $table->timestamps(); // 自动创建 created_at 和 updated_at 字段
    });
}

这段代码非常易读,并且可以用于创建任何支持的数据库表。

3. 可逆性(回滚)
每个迁移文件都包含两个核心方法:up() 和 down()。

up(): 用于执行新的更改(创建表、添加字段等)。
down(): 用于撤销 up() 方法所做的更改(删除表、移除字段等)。

这让你可以轻松地回退到之前的数据库状态。

常用回滚命令:

php artisan migrate:rollback: 回滚上一次的迁移操作。
php artisan migrate:rollback --step=5: 回滚最近5次迁移操作。
php artisan migrate:reset: 回滚所有已运行的迁移(清空所有表)。

4. 部署与同步
在部署应用到生产环境时,你只需要在服务器上运行 php artisan migrate(通常作为部署脚本的一部分)。

Laravel 会检查 migrations 表(该表由框架自动创建,用于记录已运行的迁移),然后只执行那些还未运行的迁移文件。

这确保了生产环境的数据库结构总是与代码库中定义的最新结构完全同步,极大地简化了部署流程。

5. 保持一致性
迁移强制要求团队使用统一的、定义良好的方式来修改数据库。

它成为了数据库结构变化的“唯一真相源”,所有人都基于这套迁移文件工作,避免了手动修改数据库可能带来的混乱和不一致。

因为官方服务器的服务器连不上,设置 proxy 也连不上,这点很奇怪。

怎样搭建一个中继,可以正常使用?


----------------

How to set up a BTSync relay?

Since the official servers are unreachable and setting up a proxy also fails to connect, this is quite strange.

How can I set up a relay that functions properly?

最近在学习laravel,在执行php artisan make:model xxx命令时,遇到一条报错,如下:

Fatal error: composer detected issues in your platform: Your composer dependencies require a pHp version">= 8.2.8". You are runing5.6.4. in D: phpEnv.....

这是在执行composer时会运行的一个环境检测脚本,当前站点的php版本是8.2,但是还是出现了上面的报错。

于是到cmd中执行php -v,返回版本是8.2。到站点中写了一个phpinfo()返回也是8.2,说明目前的版本是8.2无疑。

既然都没有问题,那问题出在哪里? 网上也没有找到可以将composer修改配置文件的方法,当今之计,那就把phpenv中其它版本删掉看看。

转机就出在这里,当我要删掉php5.6时,弹出一个对话框:卸载"PHP-5.6"失败!此PHP已被设置成默认PHP-CLI版
本! ,这提醒到我,于是在phpenv的设置菜单下,有一个phpcli默认版本的设置:

phpenv中phpcli版本设置

在这里切换到php8.2,重启服务居然还是故障依旧,有点吐血,于是把php5.6卸载掉,composer make:model执行成功。

 

虽然问题已经解决,但引申出一个php多版本共存时phpcli版本设置问题。得闲需再研究一下。

 

网摘:

告别繁琐的 PHP 版本切换! 使用 pv,一键安装、极速切换,轻松管理多版本,让开发PHP版本兼容调试更高效!

https://mp.weixin.qq.com/s/AFv7VtxLXjrVdHpcB1XG8g