首页 > 解决方案 > Laravel - 在不同的数据库实例上急切加载过滤相关模型

问题描述

我正在尝试实现此处定义的过滤。

这有效(从控制器 A 过滤模型 A),但是控制器 A/模型 A 与模型 B 有关系,这是我想要过滤的,以及从模型 B 到模型 C 的第三关系。

模型 A 托管在数据库实例 1 上,模型 B 托管在数据库实例 2 上并且完全分离。这些关系,没有任何过滤器,工作正常。

试图搞砸,我尝试了类似下面的方法,这显然不起作用,但希望能说明我正在尝试做的事情。此过滤器应用于模型 A

protected function sn($sn)
{
    $s= Bid::where('crm', function ($query) {
        $query->where('sNumber', '=', 'SN512345');
    })->get();

    return $s;
}

SQLSTATE[42S22]:[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名“crm”无效。(SQL: select * from [bids] where [crm] = (select * where [sNumber] = SN512345))

出价是模型 A/控制器 A,CRM 是模型 B,这是我要过滤的模型。

我曾想过在模型中有许多不同的函数来过滤,但是我不知道这是否是最好的解决方案,我认为最好把它全部放到另一个类中。

我尝试了以下方法,但它不起作用,因为它将查询应用于 DB1。

$s= Bid::with('crm')->whereHas('crm', function ($query) {
        $query->where('sNumber', '=', 'SN512345');
    })->get();

[SQL Server]无效的对象名称“机会”。(SQL: select * from [bids] where exists (select * from [Opportunity] where [bids].[crm_ref] = [Opportunity].[sNumber] and [sNumber] = SN512345))

有没有办法以某种连贯且可重用的方式实现这一点?我正在考虑加载 Bid::,使用应用过滤器加载 CRM::,然后以 Eloquent 执行此操作的正常方式将 CRM:: 附加到 Bid::。

谢谢。

编辑:我在 BidFilter.php 中使用以下过滤器 protected function sn($sn) { $users = DB::connection('sqlsrv_crm')->table('OpportunityBase')->select('*')->where('new_SalesNumber', '=', $sn)->get(); return $users; }

这过滤了结果集,正如我在调试栏中看到的那样: 调试栏查询

然而,这也加载了正常的未过滤急切加载的 CRM 关系。如何切换到过滤后的 CRM 结果而不是默认的未过滤?

BidController 索引方法:

public function index(BidFilter $filters)
{
        $bids = $this->getBids($filters);
        return view('public.bids.index', compact('bids'));
}

出价过滤器

    public function index(BidFilter $filters)
{
        $bids = $this->getBids($filters);
        return view('public.bids.index', compact('bids'));
}

标签: laraveleloquentfiltering

解决方案


推荐阅读