laravel whereHas 多数据库跨库查询问题 各位大佬快看看
使用版本 laravel8+
A 数据库
namespace App\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
use HasFactory;
protected $connection = 'a';
protected $table = 'users';
}
B 数据库
namespace App\Models\Order;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Order extends Model{
use HasFactory;
protected $connection = 'b';
protected $table = 'order';
public function user()
{
return $this->belongsTo(User::class);
}
}
查询
use Illuminate\Database\Eloquent\Builder;
$query = Order::query()->where('goods_id',2);
$query->whereHas('user',functon(Builder $builder) use ($data){
$builder->where('mobile','LIKE','%'.$data['mobile].'%');
})
$query->paginate();
以上应用场景 及代码
A 库 有 表前缀 B库 也有表前缀
A库前缀 a_
B库前缀 b_
问题 进行 whereHas 的时候 会走 A 库的连接 不会走B 库的 及表前缀
敢问各位大佬 有何方法解决
查询会失败
(SQL: select count(*) as aggregate from `b_order` where b_order.goods_id = 2 and exists (select * from `b_users` where `b_order`.`user_id` = `b_users`.`id` and `mobile` LIKE %153%)
laravel 会自动使用B的前缀
预期 sql
SELECT * FROM b.b_order WHERE b.b_order.goods_id = 2 EXISTS(SELECT * FROM a.a_users WHERE b.b_order.user_id = a.a_user_id AND a.a_user.`mobile` LIKE %153%)
我的表前缀都直接写在
$table
里,所以没这问题,不过我想说的主要是whereHas
效率很低,推荐用whereHasIn
给 Eloquent 的 whereHas 加个 where in 的优化
扩展包
在
whereHas
里from
指定数据库连接名,像这样子查询是在同数据库内,垮库用不了子查询,你跨库难不成还能连表么?
试试这个包
官方回答的是不支持
有过这个跨库连表查询的场景,当时用的
LEFT JOIN
查的没试过这种连表,但是我联想到两种方案:
一、在模型里重写
$table
,代码如下:二、在模型中使用构造函数,使用父类
Model
的setTable
方法设置表名,代码如下:我也遇见了这个问题哈哈。
我也遇见这个问题了,请问解决了吗?
怎么解决的呀,我也遇到了这个问题
A.php
B.php
使用
遇到相同的问题,不同的是我的结构是
其中order是属于database2。楼上的答案都不行,最后看了这个解决了stackoverflow.com/questions/273946...
解决办法增加order类的构造方法