Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để sử dụng orchestral / tenanti trong Laravel 5 để xây dựng một ứng dụng nhiều người thuê với nhiều cơ sở dữ liệu?

+1 đến @morphatic câu trả lời, nó chính xác trên hầu hết các nội dung.

Di chuyển

Đối với cơ sở dữ liệu chính của bạn, bạn sẽ có thể sử dụng database/migration mặc định và sử dụng php artisan make:migrationphp artisan migrate .

Tuy nhiên, Tenanti sẽ sử dụng đường dẫn di chuyển được đặt trong cấu hình "trình điều khiển". ví dụ:

'path' => database_path('tenanti/user'),

Trong trường hợp này, quá trình di chuyển sẽ được tạo / di chuyển từ database/tenanti/user (bạn có thể chọn thư mục khác và nó sẽ sử dụng thư mục đó). Khi bạn thiết lập điều này, bạn có thể tạo tệp di chuyển mới cho đối tượng thuê người dùng thông qua php artisan tenanti:make user create_blogs_table (làm ví dụ) và chạy quá trình di chuyển qua php artisan tenanti:migrate user (xem sự giống nhau giữa lệnh di chuyển Laravel và Tenanti?).

Trình điều khiển

Trình điều khiển chỉ là nhóm của một đối tượng thuê, bạn có thể nhóm nó theo người dùng, công ty hoặc nhóm, v.v. Và có khả năng bạn có thể yêu cầu nhiều hơn một loại nhóm cho mỗi dự án, nếu không, hầu hết thời gian bạn chỉ sử dụng duy nhất " nhóm "hoặc" trình điều khiển ".

Xác thực hoặc truy cập DB

Trước hết, bạn cần xem xét cách bạn định phân biệt từng đối tượng thuê. Hầu hết thời gian tôi sẽ thấy mọi người có xu hướng chọn tên miền phụ. Vì vậy, trong trường hợp này, bạn cần kiểm tra xem miền phụ thuộc về bất kỳ người dùng nào (bằng cách truy vấn cơ sở dữ liệu chính) bằng cách sử dụng phần mềm trung gian và sau đó kết nối với cơ sở dữ liệu của người dùng đó.

Tenanti không quản lý phần đó của quy trình vì mọi người có phong cách khác nhau về khía cạnh đó, nhưng chúng tôi cung cấp mã để kết nối động với đối tượng thuê cơ sở dữ liệu của bạn từ cấu hình cơ sở dữ liệu cơ sở.

Giả sử bạn có cấu hình sau:

<?php

return [
    'fetch' => PDO::FETCH_CLASS,
    'default' => 'primary',
    'connections' => [
        'primary' => [
            //
        ],
        'tenants' => [
                'driver'    => 'mysql',
                'host'      => 'dbhost',     // for user with id=1
                'username'  => 'dbusername', // for user with id=1
                'password'  => 'dbpassword', // for user with id=1
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
                'strict'    => false,
            ],
       ],
    ],
    'migrations' => 'migrations',
    'redis' => [ ... ],
];

Bạn có thể làm theo bước có sẵn trong https://github.com/orchestral/ tenanti # multi-database-connection-setup và thêm mã sau.

<?php namespace App\Providers;

use Orchestra\Support\Facades\Tenanti;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Tenanti::setupMultiDatabase('tenants', function (User $entity, array $template) {
            $template['database'] = "tenant_{$entity->getKey()}";

            return $template;
        });
    }
}

Điều này sẽ đảm bảo rằng bạn đang sử dụng tenant_1 cơ sở dữ liệu cho người dùng =1, tenant_2 cơ sở dữ liệu cho user =2, v.v.

Vậy làm cách nào để Tenanti phát hiện người dùng nào nếu đang hoạt động?

Đây là nơi bạn cần thêm logic vào phần mềm trung gian của mình.

$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();

Tenanti::driver('user')->asDefaultDatabase($user, 'tenants_{id}');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lặp qua tập kết quả mysql

  2. PHP 5.4 PDO không thể kết nối với MySQL 4.1+ bằng cách sử dụng xác thực không an toàn cũ

  3. Cách tìm các hàng có giá trị chứa chữ thường

  4. Boolean vs tinyint (1) cho các giá trị boolean trong MySQL

  5. Cú pháp CẬP NHẬT SQL - Được DBMS liệt kê