asdh / save-model
这是在数据库中保存数据的新方法
Requires
- php: ^8.0
- illuminate/contracts: ^8.37
- spatie/laravel-package-tools: ^1.4.3
Requires (Dev)
- brianium/paratest: ^6.2
- nunomaduro/collision: ^5.3
- orchestra/testbench: ^6.15
- phpunit/phpunit: ^9.3
- spatie/laravel-ray: ^1.23
- vimeo/psalm: ^4.8
README
Save Model 是一个 Laravel 包,允许您以新的方式在数据库中保存数据。您再也不必担心模型中的 $guarded
和 $fillable
属性。只需放松并使用 Save Model
包。
安装
您可以通过 composer 安装此包
composer require asdh/save-model
您可以使用以下命令发布配置文件:
php artisan save-model:publish
or
php artisan vendor:publish --provider="Asdh\SaveModel\SaveModelServiceProvider"
这是已发布配置文件的内容
// config/save_model.php return [ /** * The directory name where the files should be stored * This can be changed via 'saveableFields' method on model */ 'file_upload_directory' => 'files', ];
使用方法
// In controller use Asdh\SaveModel\SaveModel; SaveModel::new( new User, $request->only(['name', 'email', 'password', 'image']) )->execute(); // OR (new SaveModel( new User, $request->only(['name', 'email', 'password', 'image']) )->execute();
您只需这样做,就会创建一个新用户并将其保存到 'users' 表中。密码将被自动加密,上传图片也将自动处理。
要更新模型,您只需传递要更新的模型即可。
// In controller use Asdh\SaveModel\SaveModel; $user = User::find(1); SaveModel::new( $user, $request->only(['name', 'email']) )->execute();
只有姓名和电子邮件将被更新,其他列将不会被修改。
为此,您需要做以下这些事情
前往 User 模型类或其他任何模型类,并将 CanBeSavedContract
类添加到其中。在此示例中,我将使用 User 模型。
use Asdh\SaveModel\Contracts\CanBeSavedContract; class User extends Authenticatable implements CanBeSavedContract { }
添加此内容后,您需要在 User 模型中添加 saveableFields
方法,并像这样映射 users 表的每个列
use Asdh\SaveModel\Contracts\CanBeSavedContract; use Asdh\SaveModel\Fields\DatetimeField; use Asdh\SaveModel\Fields\FileField; use Asdh\SaveModel\Fields\PasswordField; use Asdh\SaveModel\Fields\StringField; class User extends Authenticatable implements CanBeSavedContract { public function saveableFields(): array { return [ 'name' => StringField::new(), 'email' => StringField::new(), 'email_verified_at' => DatetimeField::new(), 'password' => PasswordField::new(), 'image' => FileField::new(), ]; } }
完成此操作后,您就可以开始了。在控制器中,您只需获取数据并使用 SaveModel
类
use Asdh\SaveModel\SaveModel; SaveModel::new( new User, $request->only(['name', 'email', 'password', 'image']) )->execute(); // OR (new SaveModel( new User, $request->only(['name', 'email', 'password', 'image']) )->execute();
文件将使用默认的 Laravel 文件系统
上传。这意味着您可以直接配置将文件直接上传到 S3
或 Laravel 支持的任何其他位置。
此外,文件将默认上传到 files
目录。您可以通过更改配置文件 save_model.php
中的 file_upload_directory
值来全局更改此设置。
您也可以按模型更改此设置,如下所示
// app/Models/User.php public function saveableFields(): array { return [ 'image' => FileField::new()->setDirectory('images'), ]; }
现在它将把用户的 image
保存到 images
目录中,对于其他所有 Models
,它将使用 save_model.php
配置文件。
您还可以按模型选择 Laravel 文件系统的 disk
,如下所示
// app/Models/User.php public function saveableFields(): array { return [ 'image' => FileField::new() ->setDirectory('images') ->setDisk('s3'), ]; }
默认情况下,上传的文件将生成随机名称,但您也可以更改此设置。您只需在 setFileName
方法中传递闭包即可。您将能够访问上传的文件。您从那里返回的任何内容都将作为文件名保存到数据库中。
此示例展示了如何返回原始文件名。
// app/Models/User.php use Illuminate\Http\UploadedFile; public function saveableFields(): array { return [ 'image' => FileField::new() ->setDirectory('images') ->setFileName(function (UploadedFile $uploadedFile) { return $uploadedFile->getClientOriginalName(); }), ]; }
如果您想以原始名称上传文件,可以这样做
// app/Models/User.php use Illuminate\Http\UploadedFile; public function saveableFields(): array { return [ 'image' => FileField::new() ->setDirectory('images') ->uploadAsOriginalName(), ]; }
请注意,如果同时使用 setFileName
和 uploadAsOriginalName
方法,则 setFileName
方法将优先。
不仅如此,在更新模型时,文件的删除也将自动处理。默认情况下,当模型更新时,如果上传了新文件,旧文件将自动删除。如果您不想删除旧图片,则可以链式调用 dontDeleteOldFileOnUpdate
方法。
// app/Models/User.php use Illuminate\Http\UploadedFile; public function saveableFields(): array { return [ 'image' => FileField::new() ->setDirectory('images') ->dontDeleteOldFileOnUpdate(), ]; }
可用字段
Asdh\SaveModel\Fields\StringField::class Asdh\SaveModel\Fields\IntegerField::class Asdh\SaveModel\Fields\DatetimeField::class Asdh\SaveModel\Fields\DateField::class Asdh\SaveModel\Fields\TimeField::class Asdh\SaveModel\Fields\PasswordField::class Asdh\SaveModel\Fields\FileField::class Asdh\SaveModel\Fields\BooleanField::class
未来将添加其他字段,并且我欢迎 pull requests。
创建自己的模型字段类
您也可以创建自己的字段类。要创建一个,您需要运行 artisan 命令
php artisan make:field BooleanField
这将创建一个位于 App\ModelFields
目录中的 BooleanField
类,其外观如下所示
<?php namespace App\ModelFields; use Asdh\SaveModel\Fields\Field; class BooleanField extends Field { public function execute(): mixed { // Perform your logic and return the value... // return strtoupper($this->value) } }
不需要将 BooleanField
类放在 App\ModelFields
目录内。您可以将其放置在您喜欢的任何位置。
您将可以通过 $this->value
访问从控制器传递过来的数据。然后您可以做任何想做的事情,并返回您希望保存到数据库中的值。在上面的例子中,我们可以这样做:
<?php namespace App\ModelFields; use Asdh\SaveModel\Fields\Field; class BooleanField extends Field { public function execute(): mixed { return in_array($this->value, [1, '1', true, 'true', 'on', 'yes']); } }
如果输入是以下任何一个,我们将将其视为 true,并将这些值中的每一个都保存为 true
(在数据库中存储时将变为 1
)。
然后您可以在模型的 saveableFields
方法中轻松使用自己的字段。现在您可以像这样使用这个 BooleanField
以及其他字段:
use Asdh\SaveModel\Contracts\CanBeSavedContract; use Asdh\SaveModel\Fields\DatetimeField; use Asdh\SaveModel\Fields\FileField; use Asdh\SaveModel\Fields\PasswordField; use Asdh\SaveModel\Fields\StringField; use App\ModelFields\BooleanField; class User extends Authenticatable implements CanBeSavedContract { public function saveableFields(): array { return [ 'name' => StringField::new(), 'email' => StringField::new(), 'email_verified_at' => DatetimeField::new(), 'password' => PasswordField::new(), 'image' => FileField::new(), 'is_admin' => Boolean::new(), ]; } }
请确保正确添加命名空间,如上所示。
测试
composer test
变更日志
有关最近更改的详细信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
许可协议
MIT 许可协议(MIT)。有关更多信息,请参阅许可文件。