Строка запроса клонирования Laravel

Можно ли клонировать строку запроса, чтобы я мог написать ее один раз и внести изменения в долгий путь без привязки других результатов?

$query = DB::table('users')
         ->where('id', '=', '123');

$queryGet = $query;
$queryPaginate = $query;
$queryCount = $query;

if(Input::has('get'))
  $queryGet = $queryGet->get();

if(Input::has('paginate'))
  $queryPaginate = $queryPaginate->paginate(25);

if(Input::has('count'))
  $queryCount = $queryCount->count(DB::raw('Distinct users.*'));

Потому что прямо сейчас, paginate изменит первый get().

благодаря

Ответы

Ответ 1

У вас был правильный словарный запас :) В PHP5+ попробуйте клонирование:

<?php
$queryGet = clone $query;
$queryPaginate = clone $query;
$queryCount = clone $query;

http://php.net/manual/en/language.oop5.cloning.php

Ответ 2

Ответ Mopo922 - это правильный способ сделать это на Laravel> = 4.1. Но в предыдущих версиях запрос не был "глубоким клоном" и приводил к неожиданным результатам, поскольку основной запрос хранится в дочернем объекте Query, а не в почтовом Builder.

Чтобы избежать этой ошибки, вы можете использовать:

$newClone = new \Illuminate\Database\Eloquent\Builder(clone $builder->getQuery());

Вы можете увидеть эту историю ошибок/исправлений на странице: https://github.com/laravel/framework/issues/1336