ORM 跨庫關聯

看上隔壁小花了啦發表於2020-10-16

很多人應該都遇到吧。

1、.env 檔案配置

按照原先的環境變數重新配置一份

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=root
DB_PASSWORD=

OTHER_DB_CONNECTION=mysql
OTHER_DB_HOST=127.0.0.1
OTHER_DB_PORT=3306
OTHER_DB_DATABASE=other_database
OTHER_DB_USERNAME=root
OTHER_DB_PASSWORD=

2、orm 配置指定連線

config/database.php 中配置額外的 mysql 連線

/**
 * 其他庫
 */
'other_mysql' => [
    'driver' => 'mysql',
    'url' => env('OTHER_DATABASE_URL'),
    'host' => env('OTHER_DB_HOST', '127.0.0.1'),
    'port' => env('OTHER_DB_PORT', '3306'),
    'database' => env('OTHER_DB_DATABASE', 'forge'),
    'username' => env('OTHER_DB_USERNAME', 'forge'),
    'password' => env('OTHER_DB_PASSWORD', ''),
    'unix_socket' => env('OTHER_DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

3、設定模型

user 模型

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    protected $connection = 'other_mysql'; // 指定連線

    protected $table = 'users';    // 資料表名稱

    protected $primaryKey = 'user_id';    // 表主鍵

    public $incrementing = false;    // 主鍵是否自增

    protected $guarded = [];    // create 方法黑名單欄位

    /**
     *    使用者其他資訊
     */
    public function other()
    {
        return $this->belongsTo(UserOther::class, 'user_id', 'user_id');
    }
}

user_other 模型

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserOther extends Model
{
    protected $connection = 'mysql'; // 指定連線

    protected $table = 'users';    // 資料表名稱

    protected $primaryKey = 'other_id';    // 表主鍵

    public $incrementing = false;    // 主鍵是否自增

    protected $guarded = [];    // create 方法黑名單欄位
}

提示

請使用 belongsTo 方法關聯,hasOne 方法關聯的資料始終未 null[]

求問大佬

文件上所說的 belongsTo 方法用於定義反向關聯,但是“反向”這取決於個人理解,為什麼模型設定 $connection 後就沒辦法使用 hasOnehasMany 方法獲取到有效資料呢。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
未知的永遠是最精彩的!

相關文章