asdh / save-model

这是在数据库中保存数据的新方法

1.0.2 2021-09-07 17:00 UTC

This package is auto-updated.

Last update: 2024-09-09 11:49:58 UTC


README

Save Model 是一个 Laravel 包,允许您以新的方式在数据库中保存数据。您再也不必担心模型中的 $guarded$fillable 属性。只需放松并使用 Save Model 包。

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

安装

您可以通过 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(),
    ];
}

请注意,如果同时使用 setFileNameuploadAsOriginalName 方法,则 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)。有关更多信息,请参阅许可文件