Laravel克隆查询字符串

Bri*_*Bri 10 php 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.*'));
Run Code Online (Sandbox Code Playgroud)

因为现在,paginate将改变第一个get().

谢谢

mop*_*922 12

你的词汇表完全正确:)在PHP5 +中,尝试克隆:

<?php
$queryGet = clone $query;
$queryPaginate = clone $query;
$queryCount = clone $query;
Run Code Online (Sandbox Code Playgroud)

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

  • 另外:在新的 PHP 版本中,您还可以直接使用克隆的查询对象,而无需存储中间状态。例如:`$queryPaginate = (clone $query)-&gt;paginate(25);` (3认同)

Naz*_*nzo 6

Mopo922 答案是在 Laravel >= 4.1 上执行此操作的正确方法。但是,在以前的版本中,查询不会“深度克隆”,并且会产生意外的结果,因为主查询存储在子Query对象中,而不是 mail 中Builder

为了避免这个错误,你可以使用:

$newClone = new \Illuminate\Database\Eloquent\Builder(clone $builder->getQuery());
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置查看此错误/修复故事:https ://github.com/laravel/framework/issues/1336