# Kylin Modules 模型管理

## 1. 模型管理概述

Kylin Modules 支持模块的模型管理，每个模块可以有自己的模型，用于处理数据的存储和检索。

## 2. 模型创建

### 2.1 基本模型

在模块的 `Models` 目录中创建模型：

```php
<?php

namespace Modules\Blog\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * 表名
     *
     * @var string
     */
    protected $table = 'blog_posts';

    /**
     * 可填充字段
     *
     * @var array
     */
    protected $fillable = [
        'title',
        'content',
        'user_id',
        'status',
    ];

    /**
     * 隐藏字段
     *
     * @var array
     */
    protected $hidden = [
        'created_at',
        'updated_at',
    ];

    /**
     * 时间戳
     *
     * @var bool
     */
    public $timestamps = true;

    /**
     * 关联用户
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }

    /**
     * 关联评论
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function comments()
    {
        return $this->hasMany('Modules\Blog\Models\Comment');
    }
}
```

### 2.2 评论模型

```php
<?php

namespace Modules\Blog\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    /**
     * 表名
     *
     * @var string
     */
    protected $table = 'blog_comments';

    /**
     * 可填充字段
     *
     * @var array
     */
    protected $fillable = [
        'post_id',
        'user_id',
        'content',
        'status',
    ];

    /**
     * 隐藏字段
     *
     * @var array
     */
    protected $hidden = [
        'created_at',
        'updated_at',
    ];

    /**
     * 时间戳
     *
     * @var bool
     */
    public $timestamps = true;

    /**
     * 关联文章
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function post()
    {
        return $this->belongsTo('Modules\Blog\Models\Post');
    }

    /**
     * 关联用户
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }
}
```

## 3. 模型命名空间

### 3.1 命名空间配置

在 `config/modules.php` 文件中配置模块的命名空间：

```php
'namespace' => env('MODULES_NAMESPACE', 'Modules'),
```

### 3.2 模型命名空间

模块模型的命名空间格式为：`Modules\{ModuleName}\Models`

例如，Blog 模块的模型命名空间为：`Modules\Blog\Models`

## 4. 数据库迁移

### 4.1 创建迁移文件

在模块的 `database/migrations` 目录中创建迁移文件：

```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBlogPostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('blog_posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->integer('user_id');
            $table->string('status')->default('published');
            $table->timestamps();
        });

        Schema::create('blog_comments', function (Blueprint $table) {
            $table->id();
            $table->integer('post_id');
            $table->integer('user_id');
            $table->text('content');
            $table->string('status')->default('approved');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('blog_comments');
        Schema::dropIfExists('blog_posts');
    }
}
```

### 4.2 运行迁移

运行数据库迁移：

```bash
php artisan migrate
```

## 5. 模型关系

### 5.1 一对一关系

```php
<?php

namespace Modules\User\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function profile()
    {
        return $this->hasOne('Modules\User\Models\Profile');
    }
}

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo('Modules\User\Models\User');
    }
}
```

### 5.2 一对多关系

```php
<?php

namespace Modules\Blog\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany('Modules\Blog\Models\Comment');
    }
}

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo('Modules\Blog\Models\Post');
    }
}
```

### 5.3 多对多关系

```php
<?php

namespace Modules\Blog\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function tags()
    {
        return $this->belongsToMany('Modules\Blog\Models\Tag');
    }
}

class Tag extends Model
{
    public function posts()
    {
        return $this->belongsToMany('Modules\Blog\Models\Post');
    }
}
```

## 6. 模型查询

### 6.1 基本查询

```php
use Modules\Blog\Models\Post;

// 获取所有文章
$posts = Post::all();

// 获取单个文章
$post = Post::find(1);

// 条件查询
$posts = Post::where('status', 'published')->get();

// 排序
$posts = Post::orderBy('created_at', 'desc')->get();

// 分页
$posts = Post::paginate(10);
```

### 6.2 关联查询

```php
use Modules\Blog\Models\Post;

// 预加载关联
$posts = Post::with('user', 'comments')->get();

// 延迟加载关联
$post = Post::find(1);
$user = $post->user;
$comments = $post->comments;

// 条件关联查询
$posts = Post::whereHas('comments', function ($query) {
    $query->where('status', 'approved');
})->get();
```

### 6.3 聚合查询

```php
use Modules\Blog\Models\Post;

// 计数
$count = Post::count();

// 最大值
$max = Post::max('id');

// 最小值
$min = Post::min('id');

// 平均值
$avg = Post::avg('id');

// 总和
$sum = Post::sum('id');
```

## 7. 模型事件

### 7.1 事件定义

```php
<?php

namespace Modules\Blog\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Events\Creating;
use Illuminate\Database\Eloquent\Events\Created;
use Illuminate\Database\Eloquent\Events\Updating;
use Illuminate\Database\Eloquent\Events\Updated;
use Illuminate\Database\Eloquent\Events\Deleting;
use Illuminate\Database\Eloquent\Events\Deleted;

class Post extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::creating(function (Post $post) {
            // 创建前的逻辑
        });

        static::created(function (Post $post) {
            // 创建后的逻辑
        });

        static::updating(function (Post $post) {
            // 更新前的逻辑
        });

        static::updated(function (Post $post) {
            // 更新后的逻辑
        });

        static::deleting(function (Post $post) {
            // 删除前的逻辑
        });

        static::deleted(function (Post $post) {
            // 删除后的逻辑
        });
    }
}
```

## 8. 常见问题

### 8.1 模型未找到

**问题**：模块模型未找到
**解决方案**：
1. 检查模型文件是否存在
2. 检查模型命名空间是否正确
3. 检查模型引用是否正确
4. 检查自动加载是否正确配置

### 8.2 数据库表未找到

**问题**：模型对应的数据库表未找到
**解决方案**：
1. 检查数据库迁移文件是否存在
2. 检查数据库迁移是否已运行
3. 检查模型的 `$table` 属性是否正确

### 8.3 关联关系错误

**问题**：模型关联关系错误
**解决方案**：
1. 检查关联关系的定义是否正确
2. 检查关联模型是否存在
3. 检查外键约束是否正确

### 8.4 模型事件不触发

**问题**：模型事件不触发
**解决方案**：
1. 检查事件定义是否正确
2. 检查事件监听器是否注册
3. 检查模型操作是否触发事件

## 9. 最佳实践

1. **模型组织**：为每个模块创建独立的模型目录
2. **命名规范**：使用清晰、描述性的模型名称
3. **表名规范**：使用模块前缀 + 表名的格式，避免表名冲突
4. **关联关系**：合理定义模型关联关系，提高代码的可读性
5. **事件使用**：使用模型事件处理业务逻辑，提高代码的可维护性
6. **查询优化**：使用预加载和延迟加载，优化数据库查询
7. **验证规则**：在模型中定义验证规则，确保数据的合法性

## 10. 总结

Kylin Modules 提供了灵活的模型管理功能，支持模块的模型创建和自动加载。通过合理的模型设计，可以实现数据的高效存储和检索，提高代码的可维护性和性能。
