Laravel whereHas多个数据源问题

whereHas 是可以允许我们向关联来加入 where 的查询约束,但是这里有一个问题,whereHas 是仅支持单条 sql 查询的,也就是说 whereHas 本身是不支持跨库查询的。如果想要学习 whereHas 的用法,可以参考:https://learnku.com/docs/laravel/9.x/eloquent-relationships/12252#d361f0


这几天使用 whereHas , 遇到了一个问题,如下

举个例子,有这样两个表,分别存在不同的数据库里

database1.A
database2.B

PHP 类如下

class A{
  protected $table = 'A';
  
  public function B()
  {
      return $this->belongsTo(B::class, 'b_id', 'id');
  }
}

class B{
  protected $table = 'B';
}

然后我们想这样使用

$query = A::query();
$obj->whereHas('B', function ($q)  {
   $q->where('xxx', xxx)
});

这个时候会报错 Base table or view not found

因为 A表和 B表分别在不同的数据库里,也就是不在同一个数据库里。我们可以把 sql 打印出来

select * from `A` where exists (select * from `B` where `A`.`b_id` = `B`.`id` and `xxx` = xxx)

这样的 sql 肯定跑不通嘛!单条SQL不支持跨库查询

那只能加多一个 数据库前缀,修改的代码如下:

$query = A::query();
$obj->whereHas('B', function ($q)  {
   $q->from('database2.B')->where('xxx', xxx)
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是几个在 Laravel 中解决并发的实例: 1. 使用数据库事务 如上所述,使用数据库事务可以保证在多个用户同时执行数据库操作时,只有一个用户可以提交,确保数据的一致性。 2. 使用锁机制 Laravel 提供了锁机制,可以用来处理并发问题。例如,使用 `lockForUpdate()` 方法对要更新的数据进行加锁,其他用户无法修改该数据,等待锁释放后才能继续操作。 ``` DB::table('users')->where('id', 1)->lockForUpdate()->update(['name' => 'new name']); ``` 3. 使用 Redis Laravel 提供了 Redis 缓存驱动,可以用来处理并发问题。例如,使用 Redis 的 `setnx()` 方法可以实现多个用户同时访问一个资源时,只有一个用户能够获取到该资源。 ``` $redis = Redis::connection(); if ($redis->setnx('key', 'value')) { // 成功获取到资源 // ... $redis->del('key'); // 释放资源 } else { // 资源被其他用户占用,不能获取 // ... } ``` 4. 使用消息队列 Laravel 提供了多种消息队列驱动(如 Redis、Beanstalkd、Amazon SQS 等),可以用来解决并发问题。例如,将需要执行的任务放到消息队列中,然后使用队列消费者来处理任务,可以实现多个用户同时执行任务,保证任务的顺序和一致性。 ``` // 将任务放到队列中 dispatch(new ProcessPodcast($podcast)); // 处理队列任务 php artisan queue:work ``` 以上是在 Laravel 中解决并发的几个实例,可以根据具体业务场景选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值