ORM 跨库关联

很多人应该都遇到吧。

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 方法获取到有效数据呢。

补充

关联的时候也可以使用 from 方法如下:

User::with([
    'other' => function ($q) {
        $q->from('other_mysql.other')->where()->select();
    }
])
本作品采用《CC 协议》,转载必须注明作者和本文链接
未知的永远是最精彩的!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

orm的关联关系如果是纯粹是在客户端php处理的,是不依赖你绑定的数据库的。可以试试 one :smile: 各种关系可以灵活运用

3年前 评论

belong to 关系 A表 a_id B表 a_id B belong to A ,A hasMany B, A表 a_id,b_id B表 b_id A hasOne B

3年前 评论

同一台服务器的不同库联查的话 你试试在你model的$table属性里加上数据库名的前缀

protected $table = 'db1.users';    // 数据表名称

类似这样指明这个表是哪个数据库的

3年前 评论
tomandyudezhi (作者) 3年前
看上隔壁小花了啦 (楼主) 3年前
hawind 3年前
tomandyudezhi (作者) 3年前
CodeFarmer 3年前

数据库的表直接全部缓存了,如何直接关联缓存的数据

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!