【问题标题】:Laravel search for relation field value + relation field value equals field valueLaravel搜索关系字段值+关系字段值等于字段值
【发布时间】:2019-09-26 11:03:30
【问题描述】:

我正在使用 Laravel 5.8,我需要执行一个查询,搜索关系中特定字段的值 + 另一个关系中特定字段的值是否等于主表的字段值。

更具体地说,模型是:JobAdApplicationOfferApplicationStatusOfferStatus。每个JobAd 都有一个workers_needed 字段。我想获取所有招聘广告,其中他们的申请状态已获批准 + 提供状态已获批准 = job_ad.workers_needed

每个JobAd hasMany ApplicationOffer

每个Application 属于 ApplicationStatus

每个Offer 属于 Offerstatus

每个 ApplicationStatusOfferStatus 都有 approved 值,即 boolean

【问题讨论】:

    标签: mysql sql laravel eloquent


    【解决方案1】:

    我不确定这是否可行(从未尝试过),但您可以尝试将withCount()havingRaw() 结合使用:

    $data = JobAd::withCount([
            'applications' => function ($query) {$query->where('status', 'approved');},
            'offers'       => function ($query) {$query->where('status', 'approved');},
        ])
        ->havingRaw('applications_count + offers_count = workers_needed')
        ->get();
    

    【讨论】:

    • 我认为这是正确的,我被误认为使用 sum()
    • 它几乎成功了,我只需要再做一件事。我必须在查询开始时将 JobAd 的所有列添加到 groupBy 方法中。谢谢!
    • @TheAngelM97 我认为没有groupBy()它应该可以工作(至少对于MySQL)。
    【解决方案2】:

    job_ad.workers_needed。我不明白,但这应该给你一个想法

     $jobs = JobAd::whereHas('applications', function($q){
            $q->where('status', true);
        })->whereHas('offers', function($q){
            $q->where('status', true);
        })->get();
    

    【讨论】:

    • 我知道 whereHas,但我这里需要的是更高级的。我需要批准的申请和报价的总和等于字段 workers_needed
    • 所以你想获得 sum( count (已批准的申请) + count(已批准的报价) ) = workers_needed 的所有工作?
    • 是的,我正在寻找最合适的方法。从数据库中获取所有内容后,我可以轻松过滤,但我不想每次都这样做,因为将来我将不得不通过 10000 个广告才能找到与该语句匹配的广告。如果我能在一个查询中做到这一点,那就更好了
    • 尝试改变 whereHas to withCount 和 ->havingRaw('SUM(applications_count+offers_count) = workers_needed')->get();最后不确定这是否可行
    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 2018-01-09
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多