如何在 Laravel 中重用 Eloquent 构建器的部分内容
How to reuse parts of Eloquent builder in Laravel
有没有办法重用 Laravel 中的部分查询?例如,如果我有两个共享任意长度部分的查询,我可以创建一个 function/variable 来代替该部分吗?
玩具查询:
$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 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();
您应该可以使用 a scope 来做到这一点:
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();
有没有办法重用 Laravel 中的部分查询?例如,如果我有两个共享任意长度部分的查询,我可以创建一个 function/variable 来代替该部分吗?
玩具查询:
$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 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();
您应该可以使用 a scope 来做到这一点:
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();