【问题标题】:Dynamic query eloquent动态查询雄辩
【发布时间】:2020-01-14 10:36:01
【问题描述】:

我有这 2 个链接模型:jobsjob_translations。一份工作有很多翻译。所以在我的工作模式中,有:

/**
 * Get the translations for the job.
 */
public function translations()
{
    return $this->hasMany('App\Models\JobTranslation');
}

在我的控制器中,我想像这样动态构建一个查询:

$query = Job::query();
if ($request->has('translation')) {
            $query->translations()->where('external_translation', 'ilike', '%'.$request->translation.'%');
        }

$jobs = $query->paginate(10);

我有这个错误:

调用未定义的方法 Illuminate\Database\Eloquent\Builder::translations()

Eloquent 可以做这样的动态查询吗?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    是的,这是可能的。您正在寻找的是whereHas('translations', $callback) 而不是translations()

    $query = Job::query();
    if ($request->has('translation')) {
        $query->whereHas('translations', function ($query) use ($request) {
            $query->where('external_translation', 'ilike', '%'.$request->translation.'%');
        });
    }
    
    $jobs = $query->paginate(10);
    

    使用when($condition, $callback) 代替if 可以进一步改进您的查询:

    $jobs = Job::query()
        ->when($request->translation, function ($query, $translation) {
            $query->whereHas('translations', function ($query) use ($translation) {
                $query->where('external_translation', 'ilike', "%{$translation}%");
            });
        })
        ->paginate(10);
    

    【讨论】:

    • 你好 Namoshek。太好了,它完全按预期工作。你拯救了我的一天。谢谢美人。多姆
    【解决方案2】:

    您应该在下一个链式查询中检测到该问题,如下所示:

    $query = Job::with('translations')->query();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 2017-11-11
      • 2018-01-26
      • 2014-04-12
      • 2021-07-23
      • 2019-04-02
      • 1970-01-01
      相关资源
      最近更新 更多