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
后就没办法使用 hasOne
或 hasMany
方法获取到有效数据呢。
补充
关联的时候也可以使用 from 方法如下:
User::with([
'other' => function ($q) {
$q->from('other_mysql.other')->where()->select();
}
])
本作品采用《CC 协议》,转载必须注明作者和本文链接
orm的关联关系如果是纯粹是在客户端php处理的,是不依赖你绑定的数据库的。可以试试 one :smile: 各种关系可以灵活运用
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
同一台服务器的不同库联查的话 你试试在你model的$table属性里加上数据库名的前缀
类似这样指明这个表是哪个数据库的
数据库的表直接全部缓存了,如何直接关联缓存的数据