【问题标题】:Laravel query a Model over one of it's related modelsLaravel 通过其中一个相关模型查询模型
【发布时间】:2016-05-04 10:36:43
【问题描述】:

我有一个具有相关对象的模型。这些数据本来可以存储在同一个模型中,但它驻留在不同的数据库中,该数据库仅用于查找它并将其附加到我的模型中。

假设我有以下结构: BaseModel->AttachedModel

我想获得所有附加模型的某些条件,但通过 BaseModel 因为我需要更多附加到 BaseModel 的对象。

我尝试使用BaseModel::where('attachedmodel.id', 100)->get() 来实现这一点(因为这看起来像with() 方法,我希望它会起作用)

在这种情况下,我试图获取所有 BaseModel,其中有一个 ID 为 100 的 AttachedModel。但这失败了。

可以这样做吗,或者我应该为此使用原始查询吗?

【问题讨论】:

    标签: php laravel model eloquent relationship


    【解决方案1】:

    with() 方法将立即加载关系而不过滤任何结果。您需要的是 whereHas 查询,它根据相关模型的条件过滤结果。

    $lookingForId = 100;
    Basemodel::whereHas('attachedmodels', function ($query) use ($lookingForId) {
      $query->where('id', '=', $lookingForId);
    })->get();
    

    whereHas() 第一个参数(在上面的代码中是 'attachedmodels'),应该是关系的名称,在你的模型类中定义

    【讨论】:

    • 我相信你是对的。建议的 with-construction @noodles_ftw 实际上并没有过滤结果。我正在努力让您的建议发挥作用,但这需要一些时间。到目前为止,MySQL 对我们的认可还不够;) 为您的努力和贡献+1。欢迎来到 SO 顺便说一句!
    • 这应该是正确的答案。我会接受你的。对我来说,它不起作用,因为附加的模型使用不同的驱动程序 (MSSQL),虽然查询看起来正确,但它不起作用。我相信这是因为一个查询试图合并两个数据库连接和驱动程序。
    • @noodles_ftw 所说的是对急切加载基本模型关系的约束。谢谢:)
    • 是的,我知道他们。漂亮的功能;)
    • 这将是一个高度填充的表,其中包含与另一个生产系统的实时数据库连接。因此,这不是一个合适的选择,但感谢您的建议。我决定将过滤器选项降级,只搜索一个同时也是业务 ID 的 ID。
    【解决方案2】:

    试试这个:

    BaseModel::with(['attachedmodel' => function($query) {
        $query->where('id', '100');
    }])->get()
    

    【讨论】:

    • 感谢您的回复。 100 输入变量当然是动态的。我在function($query) 之后和{ 之前添加了use($input),以便传入变量。另外我想提一下,有必要明确附加所有其他需要的相关对象,因为 Eloquent 只返回在 with 方法中定义的关系模型。谢谢! +1 并被接受。
    • 我认为这将是一个变量,但我选择了您提供的数据。不客气:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多