關於同一個連線不同資料庫之間的 Eloquent 關聯查詢

pan_zoe發表於2020-06-22

先來個妹子!

起因:由於不同業務被劃分到不同的資料庫,但是我在運營統計的時候卻要將他們串起來統計比較麻煩,whereHas,withCount,hasManyThrough,hasOneThrough,都不好使,很多關聯的表都不在一個資料庫中。

於是我想到的解決辦法如下:

資料庫 a 有users 表
|  id | name  |
| ------------ | ------------ |
|  1 | xiaoming  |
|  2 | xiaohong  |

資料庫 b 有topics 表
| id  | user_id  | data  |
| ------------ | ------------ | ------------ |
|  1 |  1 | test1  |
|  2 |  1 |  test2 |

再來看模型

class User extends Model
{
    protected $connection = 'a';

    public function Topic()
    {
        $this->hasMany(Topic::class);
    }
}

class Topic extends Model
{
    protected $connection = 'b';
}

儘管 User::with('Topic')->get(); 這肯定是沒問題的,因為這會分為兩次查詢,會切換資料庫

User::withCount('Topic')->get(); //這樣就不行了
它會產生這樣的sql語句。
select *,(select count(*) from topics where user_id = users.id ) as topic_count from users。
因為topics 在b 資料庫中所以會報 table view not found

解決方案如下:
class Topic extends Model
{
    protected $connection = 'b';
    protected $table = 'b.topics'; //這裡的b 必須是你的資料庫名
}

User::withCount('Topic')->get(); 
它會產生這樣的sql語句。
select *,(select count(*) from `b`.`topics` where `b`.`topics`.`user_id` = `users.id` ) as topic_count from `users`;

不知道各位小夥伴還有沒有更好的解決方案

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Mr.pan

相關文章