raid / core-model

Raid 核心模型包

dev-main 2024-02-06 22:27 UTC

This package is auto-updated.

Last update: 2024-09-06 23:46:41 UTC


README

此包负责处理系统中的所有模型。

安装

composer require raid/core-model

配置

php artisan core:publish-model

用法

class PostController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request): JsonResponse
    {
        $post = new Post();

        // instead of this pattern.
        // $post->title = $request->get('title');
        // $title = $post->title;
        
        // we can use this pattern.
        $post->fillAttribute('title', $request->get('title'));
        
        $title = $post->attribute('title', '');
        
        // this didn't save the model, but we can deal with that later.
    }
}

如何使用

以我们的模型类 Post 为例,你可以使用此命令创建模型类。

php artisan core:make-model Post
<?php

namespace App\Models;

use Raid\Core\Model\Models\Contracts\ModelInterface;
use Raid\Core\Model\Models\Model;

class Post extends Model implements ModelInterface
{
    /**
     * {@inheritdoc}
     */
    protected $fillable = [];
}

模型类必须实现 ModelInterface 接口。

模型类必须扩展 Model 类。

太好了,现在我们可以使用我们的新模型类。

填充模型属性。

  • 这将不会将模型保存到数据库中。
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request): JsonResponse
    {
        $post = new Post();

        $post->fillAttribute('title', $request->get('title'));

        $post->fillAttributes([
            'title' => $request->get('title'),
            'content' => $request->get('content'),
        ]);
    }
}
  • fillAttribute 方法会填充属性值,但不会将其保存到数据库中。

  • fillAttributes 方法会填充属性值,但不会将其保存到数据库中。


强制填充模型属性。

  • 这将保存模型到数据库中。
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request): JsonResponse
    {
        $post = new Post();

        $post->forceFillAttribute('title', $request->get('title'));

        $post->forceFillAttributes([
            'title' => $request->get('title'),
            'content' => $request->get('content'),
        ]);
    }
}
  • forceFillAttribute 方法会填充属性值,并将其保存到数据库中。

  • forceFillAttributes 方法会填充属性值,并将其保存到数据库中。

获取模型属性。

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Post $post): JsonResponse
    {
        $attribute = $post->attribute('title', '');

        $attributes = $post->attributes('title', 'content');

        $hasAttribute = $post->hasAttribute('title');
    }
}
  • attribute 方法如果存在属性,将返回属性值,否则返回默认值。

  • attributes 方法将返回属性值。

  • hasAttribute 方法如果模型具有属性,则返回 true,否则返回 false

使用属性实例

我们还有另一种方法使用 Raid\Core\Model\Models\Attribute 类填充模型属性。

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Raid\Core\Model\Models\Attribute;

class PostController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Post $post): JsonResponse
    {
        $attribute = new Attribute();

        $attribute->attribute('title');

        $attribute->value($request->get('title'));

        $attribute->default('default title value');
        
        $attribute->forceFill(true);
        
        $post->fillAttr($attribute);

        // or to force fill the attribute
        $post->forceFillAttr($attribute);
    }
}

模型过滤器

我们依赖于 tucker-eric/eloquentfilter 来应用模型过滤器。

你可以使用此命令创建模型过滤器类。

php artisan core:make-model-filter PostFilter
<?php

namespace App\Models\ModelFilters;

use Raid\Core\Model\Models\Filter\ModelFilter;

class PostFilter extends ModelFilter
{
}

我们需要定义 Post 模型过滤器。

使用 filter 属性。

<?php

namespace App\Models;

use App\Models\ModelFilters\PostFilter;
use Raid\Core\Model\Models\Contracts\ModelInterface;
use Raid\Core\Model\Models\Model;

class Post extends Model implements ModelInterface
{
    /**
     * {@inheritdoc}
     */
    protected $fillable = [];

    /**
     * {@inheritdoc}
     */
    protected string $filter = PostFilter::class;
}

或定义 modelFilter 方法。

<?php

namespace App\Models;

use App\Models\ModelFilters\PostFilter;
use Raid\Core\Model\Models\Contracts\ModelInterface;
use Raid\Core\Model\Models\Model;

class Post extends Model implements ModelInterface
{
    /**
     * {@inheritdoc}
     */
    protected $fillable = [];

    /**
     * Provide model filter.
     */
    public function modelFilter(): ?string
    {
        return $this->provideFilter(PostFilter::class);
    }
}

现在我们可以使用 filter 方法与我们的模型类一起,并将我们的过滤器发送以应用它。

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request): JsonResponse
    {
        $posts = Post::filter([
            'title' => $request->get('title'),
        ]);
    }
}

PostFilter 类中定义我们的过滤器。

<?php

namespace App\Models\ModelFilters;

use Raid\Core\Model\Models\Filter\ModelFilter;

class PostFilter extends ModelFilter
{
    /**
     * Filter with title.
     */
    public function title(string $title): static
    {
        return $this->whereLike('title', $title);
    }
}

就这样。

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。

致谢

安全

如果你发现任何安全相关的问题,请通过电子邮件联系,而不是使用问题跟踪器。

关于 Raid

Raid 是由 Mohamed Khedr 创建的 PHP 框架,并由 Mohamed Khedr 维护。

支持 Raid

Raid 是一个 MIT 许可的开源项目。它是一个独立项目,其持续开发得以实现。