如何在 Laravel 中重用 Eloquent 构建器的部分

问题描述 投票:0回答:2

有没有办法在 Laravel 中重用部分查询?例如,如果我有两个查询共享一些任意长的部分,我可以创建一个可以用来代替该部分的函数/变量吗?

玩具查询:

$a = TableA::join('tableb', 'tablea.bid', '=', tableb.id)
           ->join('talbec', 'tableb.cid', '=', tablec.id)
           ->join('tabled', 'tablec.did', '=', tabled.id)
           ->where('tablea_col', '=', true)->get();

$b = TableA::join('tableb', 'tablea.bid', '=', tableb.id)
           ->join('talbec', 'tableb.cid', '=', tablec.id)
           ->join('tabled', 'tablec.did', '=', tabled.id)
           ->where('tableb_col', '=', true)->get();

我想要类似的东西:

$shared = TableA::join('tableb', 'tablea.bid', '=', tableb.id)
           ->join('talbec', 'tableb.cid', '=', tablec.id)
           ->join('tabled', 'tablec.did', '=', tabled.id);

$a = shared->where('tablea_col', '=', true)->get();

$b = shared->where('tableb_col', '=', true)->get();
laravel eloquent
2个回答
5
投票

从 Laravel 8+ 开始,您可以克隆它,然后根据需要重复使用:

$shared = TableA::join('tableb', 'tablea.bid', '=', tableb.id)
           ->join('talbec', 'tableb.cid', '=', tablec.id)
           ->join('tabled', 'tablec.did', '=', tabled.id);

$a = $shared->clone()->where('tablea_col', true)->get();

$b = $shared->clone()->where('tableb_col', true)->get();

在 Laravel 8 之前,使用

$a = clone $shared;
$b = clone $shared;
$a = $a->where('tablea_col', true)->get();
$b = $b->where('tableb_col', true)->get();

0
投票

您应该能够使用范围来实现此目的:

function scopeWithBCandD($query) {
    $query->join('tableb', 'tablea.bid', '=', 'tableb.id')
      ->join('talbec', 'tableb.cid', '=', 'tablec.id')
      ->join('tabled', 'tablec.did', '=', 'tabled.id');   
}

哪个允许:

TableA::withBCandD()->where('tablea_col', true)->get();
TableA::withBCandD()->where('tableb_col', true)->get();
© www.soinside.com 2019 - 2024. All rights reserved.