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

本作品采用《CC 协议》,转载必须注明作者和本文链接
未知的永远是最精彩的!
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 3

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

1周前 评论

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

1周前 评论

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

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

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

5天前 评论
tomandyudezhi (作者) 5天前
看上隔壁小花了啦 (楼主) 4天前

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