You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多租户系统:实现添加租户的请求审批功能咨询

实现Laravel多租户租约请求审批流程

我来一步步帮你把直接创建租约改成租户审批的流程,基于你已经有accepted方法的情况,咱们从数据库到视图全流程梳理:

1. 调整数据库表结构

首先得给租约表加个状态字段,用来标记请求的状态(待审批/已接受/已拒绝)。用Laravel迁移来实现:

// 创建迁移文件
php artisan make:migration add_status_to_leases_table

打开生成的迁移文件,写入字段定义:

public function up()
{
    Schema::table('leases', function (Blueprint $table) {
        $table->enum('status', ['pending', 'accepted', 'rejected'])->default('pending');
    });
}

public function down()
{
    Schema::table('leases', function (Blueprint $table) {
        $table->dropColumn('status');
    });
}

执行迁移生效:

php artisan migrate

2. 更新Lease模型

给模型添加状态常量(方便后续调用),同时设置默认属性和关联关系:

class Lease extends Model
{
    use HasFactory;

    // 定义状态常量
    const STATUS_PENDING = 'pending';
    const STATUS_ACCEPTED = 'accepted';
    const STATUS_REJECTED = 'rejected';

    // 允许批量赋值的字段(加上新增的status)
    protected $fillable = [
        'tenant_id', 
        'landlord_id', 
        'start_date', 
        'end_date',
        // 其他原有字段...
        'status'
    ];

    // 设置默认状态为待审批
    protected $attributes = [
        'status' => self::STATUS_PENDING,
    ];

    // 关联房东和租户
    public function landlord()
    {
        return $this->belongsTo(User::class, 'landlord_id');
    }

    public function tenant()
    {
        return $this->belongsTo(User::class, 'tenant_id');
    }
}

3. 修改房东的租约创建逻辑

原来的store方法直接创建生效租约,现在改成创建待审批的请求:

class LandlordLeaseController extends Controller
{
    public function store(Request $request)
    {
        // 验证表单数据(根据你的业务需求调整规则)
        $validated = $request->validate([
            'tenant_id' => 'required|exists:users,id',
            'start_date' => 'required|date',
            'end_date' => 'required|date|after:start_date',
            // 其他字段验证...
        ]);

        // 创建待审批的租约请求
        Lease::create([
            ...$validated,
            'landlord_id' => auth()->id(), // 当前登录的房东ID
        ]);

        // 可选:给租户发送通知(后面会讲通知实现)
        $tenant = User::find($validated['tenant_id']);
        $tenant->notify(new LeaseRequestReceivedNotification(auth()->user()));

        return redirect()->back()->with('success', '租约请求已发送,请等待租户审批');
    }
}

4. 实现租户的请求处理功能

你已经有accepted方法,咱们完善它并新增拒绝逻辑,同时做好权限校验:

4.1 添加租户专属路由

在routes/web.php中添加租户处理请求的路由(注意用中间件限制只有租户能访问):

Route::middleware(['auth', 'tenant'])->group(function () {
    Route::post('/lease-requests/{lease}/accept', [TenantLeaseController::class, 'accept'])->name('lease-requests.accept');
    Route::post('/lease-requests/{lease}/reject', [TenantLeaseController::class, 'reject'])->name('lease-requests.reject');
});

4.2 实现控制器处理方法

创建租户专用控制器:

php artisan make:controller TenantLeaseController

写入接受和拒绝的逻辑:

class TenantLeaseController extends Controller
{
    public function accept(Lease $lease)
    {
        // 校验当前租户是请求的接收者
        if ($lease->tenant_id !== auth()->id()) {
            abort(403, '你无权处理该请求');
        }
        // 校验请求处于待审批状态
        if ($lease->status !== Lease::STATUS_PENDING) {
            return redirect()->back()->with('error', '该请求已处理');
        }

        $lease->update(['status' => Lease::STATUS_ACCEPTED]);

        // 可选:通知房东请求已接受
        $lease->landlord->notify(new LeaseRequestAcceptedNotification($lease));

        return redirect()->back()->with('success', '已接受租约请求');
    }

    public function reject(Lease $lease)
    {
        // 同样的权限和状态校验
        if ($lease->tenant_id !== auth()->id()) {
            abort(403, '你无权处理该请求');
        }
        if ($lease->status !== Lease::STATUS_PENDING) {
            return redirect()->back()->with('error', '该请求已处理');
        }

        $lease->update(['status' => Lease::STATUS_REJECTED]);

        // 可选:通知房东请求已拒绝
        $lease->landlord->notify(new LeaseRequestRejectedNotification($lease));

        return redirect()->back()->with('success', '已拒绝租约请求');
    }
}

4.3 租户视图展示待处理请求

在租户的仪表盘页面,展示所有待审批的租约请求,并添加操作按钮:

<div class="lease-requests">
    <h3>待处理租约请求</h3>
    @forelse(auth()->user()->leases()->where('status', \App\Models\Lease::STATUS_PENDING)->get() as $request)
        <div class="request-card">
            <p>发起方: {{ $request->landlord->name }}</p>
            <p>租期: {{ $request->start_date->format('Y-m-d') }} 至 {{ $request->end_date->format('Y-m-d') }}</p>
            <!-- 展示其他租约信息 -->

            <form action="{{ route('lease-requests.accept', $request) }}" method="POST" class="inline">
                @csrf
                <button type="submit" class="btn btn-success">接受</button>
            </form>

            <form action="{{ route('lease-requests.reject', $request) }}" method="POST" class="inline">
                @csrf
                <button type="submit" class="btn btn-danger">拒绝</button>
            </form>
        </div>
    @empty
        <p>暂无待处理的租约请求</p>
    @endforelse
</div>

5. 可选:完善状态校验和通知功能

  • 状态校验:后续业务逻辑中,只对status为accepted的租约进行生效处理,比如房东查看有效租约:
    $activeLeases = auth()->user()->landlordLeases()->where('status', Lease::STATUS_ACCEPTED)->get();
    
  • 通知功能:创建通知类实现邮件/站内信通知,比如:
    // 创建通知文件
    php artisan make:notification LeaseRequestReceivedNotification
    
    然后在通知类中实现toMail和toArray方法,给用户推送通知。

内容的提问来源于stack exchange,提问作者user9409047

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:12:03