raid / core-model
Raid 核心模型包
Requires
- php: ^8.2
- raid/core-command: dev-main
- tucker-eric/eloquentfilter: ^3.0
Requires (Dev)
- laravel/pint: ^1.10
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 许可的开源项目。它是一个独立项目,其持续开发得以实现。