Generates PHP models inheriting from CatchModel with pre-configured fillable fields, searchable columns, and relationships for the CatchAdmin framework.

Install

mkdir -p .claude/skills/model && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/5552" && unzip -o skill.zip -d .claude/skills/model && rm skill.zip

Installs to .claude/skills/model

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Generate Eloquent model for CatchAdmin module with full CatchModel features.
76 charsno explicit “when” trigger
Beginner

Key capabilities

  • Generates CatchModel class files with defined namespaces
  • Configures fillable field arrays
  • Defines searchable columns with operator mapping
  • Sets up sort field and sorting direction logic
  • Enables tree structure configuration via parent_id
  • Declares Eloquent relationships like BelongsTo or HasMany

How it works

It maps user-provided configuration properties onto a predefined PHP class template.

Inputs & outputs

You give it
Module name, Model name, table name, and desired field configurations
You get back
A PHP class file inheriting from CatchModel with properties pre-defined

When to use model

  • Create new database model for a module
  • Define searchable and fillable fields for models
  • Implement tree structure or relationship methods
  • Standardize model boilerplate code

About this skill

Step 3: Generate Model

创建 Eloquent 模型,继承 Catch\Base\CatchModel

File Location

modules/{Module}/Models/{Model}.php

Complete Template

<?php

namespace Modules\{Module}\Models;

use Catch\Base\CatchModel as Model;
use Catch\Enums\Status;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;

class {Model} extends Model
{
    protected $table = '{table}';

    protected $fillable = [
        'id',
        // business fields
        'creator_id',
        'created_at',
        'updated_at',
        'deleted_at',
    ];

    /**
     * 搜索字段配置
     * Operators: like, =, in, between
     */
    public array $searchable = [
        'name' => 'like',
        'status' => '=',
        'category_id' => '=',
    ];

    /**
     * 列表查询字段
     */
    protected array $fields = [
        'id', 'name', 'status', 'created_at'
    ];

    /**
     * 表单提交字段
     */
    protected array $form = [
        'name', 'status'
    ];

    /**
     * 表单关联同步 (多对多)
     */
    protected array $formRelations = ['roles', 'tags'];

    /**
     * 排序字段
     */
    protected string $sortField = 'sort';

    /**
     * 降序排序
     */
    protected bool $sortDesc = true;

    /**
     * 树形结构 (parent_id)
     */
    protected string $parentIdColumn = 'parent_id';

    /**
     * 是否返回树形结构
     */
    protected bool $asTree = false;

    // Relationships
    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class, 'category_id');
    }
}

CatchModel 核心属性

属性类型默认值说明
$fillablearray[]可填充字段
$searchablearray[]搜索字段及操作符
$fieldsarray['*']列表查询字段
$formarray[]表单提交字段
$formRelationsarray[]表单关联同步
$sortFieldstring''排序字段
$sortDescbooltrue是否降序
$parentIdColumnstring'parent_id'父级字段
$asTreeboolfalse返回树形结构
$isPaginatebooltrue是否分页
$dataRangeboolfalse数据权限
$isFillCreatorIdbooltrue自动填充创建人

CatchModel CRUD 方法

列表查询

// 基础列表 (自动分页、搜索、排序)
$this->model->getList();

// 自定义查询条件
$this->model->setBeforeGetList(function ($query) {
    return $query->where('type', 1);
})->getList();

// 禁用分页
$this->model->disablePaginate()->getList();

// 返回树形结构
$this->model->asTree()->getList();

创建记录

// 创建并返回 ID
$this->model->storeBy($data);

// 创建新实例
$this->model->createBy($data);

更新记录

// 更新单条
$this->model->updateBy($id, $data);

// 批量更新
$this->model->batchUpdate('id', [1, 2, 3], [
    'status' => [1, 2, 1],
]);

删除记录

// 软删除
$this->model->deleteBy($id);

// 强制删除
$this->model->deleteBy($id, force: true);

// 批量删除
$this->model->deletesBy('1,2,3');
$this->model->deletesBy([1, 2, 3]);

其他操作

// 查询单条
$this->model->firstBy($id);
$this->model->firstBy($value, 'field');

// 切换状态
$this->model->toggleBy($id);
$this->model->toggleBy($id, 'is_active');

// 恢复软删除
$this->model->restoreBy($id);
$this->model->restoreBy('1,2,3');

搜索操作符

public array $searchable = [
    'name' => 'like',      // LIKE '%value%'
    'title' => '%like',    // LIKE '%value'
    'code' => 'like%',     // LIKE 'value%'
    'status' => '=',       // = value
    'type' => 'in',        // IN (values)
    'created_at' => 'between', // BETWEEN start AND end
    'price' => '>',        // > value
    'stock' => '>=',       // >= value
];

关联关系

BelongsTo (多对一)

public function category(): BelongsTo
{
    return $this->belongsTo(Category::class, 'category_id');
}

public function creator(): BelongsTo
{
    return $this->belongsTo(\Modules\User\Models\User::class, 'creator_id');
}

HasMany (一对多)

public function items(): HasMany
{
    return $this->hasMany(OrderItem::class, 'order_id');
}

BelongsToMany (多对多)

// 需要在 $formRelations 中声明才能自动同步
protected array $formRelations = ['roles', 'tags'];

public function roles(): BelongsToMany
{
    return $this->belongsToMany(
        Role::class,
        'user_has_roles',  // pivot table
        'user_id',
        'role_id'
    );
}

public function tags(): BelongsToMany
{
    return $this->belongsToMany(Tag::class, 'product_tags');
}

树形关系 (自关联)

protected string $parentIdColumn = 'parent_id';

public function parent(): BelongsTo
{
    return $this->belongsTo(self::class, 'parent_id');
}

public function children(): HasMany
{
    return $this->hasMany(self::class, 'parent_id');
}

属性访问器 & 修改器

use Illuminate\Database\Eloquent\Casts\Attribute;

// 密码加密
protected function password(): Attribute
{
    return new Attribute(
        set: fn ($value) => bcrypt($value),
    );
}

// 状态标签
protected function statusLabel(): Attribute
{
    return new Attribute(
        get: fn () => $this->status == 1 ? '启用' : '禁用',
    );
}

// JSON 字段
protected function options(): Attribute
{
    return new Attribute(
        get: fn ($value) => json_decode($value, true) ?? [],
        set: fn ($value) => json_encode($value),
    );
}

状态枚举

use Catch\Enums\Status;

public function isEnabled(): bool
{
    return Status::Enable->assert($this->status);
}

public function isDisabled(): bool
{
    return Status::Disable->assert($this->status);
}

重写方法

自定义更新逻辑

public function updateBy($id, array $data): mixed
{
    // 密码为空时不更新
    if (empty($data['password'])) {
        unset($data['password']);
    }

    return parent::updateBy($id, $data);
}

自定义删除逻辑

public function deleteBy($id, bool $force = false, bool $softForce = false): ?bool
{
    return $this->transaction(function () use ($id) {
        // 删除关联数据
        $this->items()->where('order_id', $id)->delete();
        
        return parent::deleteBy($id);
    });
}

查询作用域

use Illuminate\Database\Eloquent\Builder;

public function scopeActive(Builder $query): Builder
{
    return $query->where('status', 1);
}

public function scopeOfType(Builder $query, int $type): Builder
{
    return $query->where('type', $type);
}

// 使用
Model::active()->ofType(1)->get();

关联预加载

// 在模型中定义默认预加载
protected $with = ['category'];

// 在控制器中
public function show($id): mixed
{
    return $this->model
        ->with(['category', 'tags'])
        ->firstBy($id);
}

外键字段自动检测规则

字段名关联方法关联模型
category_idcategory()Category::class
user_iduser()User::class
department_iddepartment()Departments::class
parent_idparent()self::class

When not to use it

  • When building models outside the CatchAdmin framework
  • When working with non-relational or NoSQL databases

Prerequisites

PHPCatchAdmin framework

Limitations

  • Restricted to the directory structure expected by CatchAdmin
  • Limited to the specific properties supported by the CatchModel base class

How it compares

It eliminates manual boilerplate typing by mapping schema definitions directly to framework-specific class properties.

Compared to similar skills

model side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
model (this skill)16moNo flagsBeginner
laravel-specialist123moNo flagsIntermediate
laravel-eloquent02moNo flagsIntermediate
laravel-development03moNo flagsIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry