乌鸦嘴文档 乌鸦嘴文档
乌鸦嘴社区 (opens new window)
乌鸦嘴社区 (opens new window)
  • 简介

  • 概念

    • 两种应用
    • 租户
      • 创建租户
      • 自定义字段
      • 在租户环境中运行命令
      • 内部密钥
      • 事件
      • 访问当前租户
      • 递增的ID
    • 域名
    • 事件
    • 路由
    • 租赁引导
    • 可选功能
  • 租赁模式

  • 单数据库

  • 识别租户

  • 多数据库

  • 深度挖掘

目录

租户

# 租户

租户可以是任何实现 Stancl\Tenancy\Contracts\Tenant 接口的模型。

该扩展包带有一个基本的Tenant模型,这个模型为平时常用的一些需求做好了准备,但在大多数情况下需要自己根据需求进行扩展,因为它不是固定这样的。

除了接口所需的功能外,基本模型还具有以下功能:

  • 强制中央连接(即使在租户上下文中,您也可以与租户模型进行交互)
  • 数据字段特征 — 允许您存储任意键。 在你的 tenants表中不存在的属性会以序列化的JSON形式进入 data字段。。
  • Id 生成特性 — 当你不提供 ID 时,将生成一个随机 uuid。 另一种方法是使用 AUTOINCREMENT 字段。 如果您希望使用数字 id,请将 create_tenants_table 迁移更改为使用 bigIncrements() 或某些此类字段类型,并将 tenancy.id_generator 配置设置为 null。 这将完全禁用 ID 生成,退回到数据库的自动增量机制。

大多数使用此扩展的应用程序需要域名/子域名标识和租户数据库。

为此,请创建一个新模型,例如 App\Tenant,看起来像这样:

<?php

namespace App;

use Stancl\Tenancy\Database\Models\Tenant as BaseTenant;
use Stancl\Tenancy\Contracts\TenantWithDatabase;
use Stancl\Tenancy\Database\Concerns\HasDatabase;
use Stancl\Tenancy\Database\Concerns\HasDomains;

class Tenant extends BaseTenant implements TenantWithDatabase
{
    use HasDatabase, HasDomains;
}

然后,在 config/tenancy.php 中配置包以使用此模型 :

'tenant_model' => \App\Tenant::class,

如果您想自定义域名Domain 模型,您也可以这样做。

如果您不需要域或数据库,请忽略上述步骤。 一切都会正常进行。

# 创建租户

你可以像其他模型一样创建租户:

$tenant = Tenant::create([
    'plan' => 'free',
]);

创建租户后,将触发一个事件。 这将执行创建和迁移数据库之类的任务,这具体取决于哪些工作监听该事件。

# 自定义字段

租户模型的属性如果没有自己的字段,将被存储在dataJSON字段中。

你可以通过覆盖你的 Tenant模型上的 getCustomColumns()方法来定义自定义字段:

public static function getCustomColumns(): array
{
    return [
        'id',
        'plan',
        'locale',
    ];
}

不要忘记在自定义字段中保留id!。

如果你想重命名data字段,请在迁移中重命名它,并在你的模型上实现这个方法:

public static function getDataColumn(): string
{
    return 'my-data-column';
}

请注意,使用 where() 查询 data 字段内的数据将要求您执行以下操作,例如:

where('data.foo', 'bar')

data字段只在模型检索和保存时被编码/解码。

有一个很好的经验是,当您需要使用WHERE子句查询数据时,应该给一个专门的字段。 这将提高性能,并且您不必考虑 data. 前缀。

# 在租户环境中运行命令

您可以在租户的上下文中运行命令,然后通过将可调用对象传递给租户对象上的 run() 方法,返回到前一个上下文(无论是中央上下文还是其他租户的上下文)。 例如:

$tenant->run(function () {
    User::create(...);
});

# 内部密钥

以内部前缀开头的键(默认情况下为 tenancy_,但您可以通过覆盖 internalPrefix() 方法对其进行自定义)供内部使用,因此不要以此开头任何属性/字段名称。

# 事件

Tenant 模型调度 Eloquent 事件,所有这些事件都有自己的类。 您可以在 事件系统 页面上阅读更多相关信息。

# 访问当前租户

你可以使用tenant()助手访问当前租户。你也可以传递一个参数,从该租户模型中获得一个属性,例如tenant('id')。

另外,你也可以用Stancl\Tenancy\Contracts\Tenant接口来注入模型,使用服务容器。

# 递增的ID

默认情况下,迁移使用 string 作为 id 列,并且当您在租户创建期间不提供 id 时,模型会生成 UUID。

如果您想改用递增 id,您可以覆盖 getIncrementing() 方法:

public function getIncrementing()
{
    return true;
}
两种应用
域名

← 两种应用 域名→

Theme by Vdoing | Copyright © 2020-2022 wyz.xyz 宁ICP备15001739号-5
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×