2017-06-01 80 views
1

所以我遇到了一个与QueryBuilder克隆有关的问题。他是我的情况,我需要运行3个独立的查询,所有基于落单“BaseQuery”:PHP Laravel查询克隆不能按预期工作

$baseQuery = $model->selectRaw("column")->whereNull("deleted_at"); 

$query1 = clone($baseQuery); 
$query1Results = $query1->where("condition", "=", 0)->get(); 

$query2 = clone($baseQuery); 
$query2Results = $query2->where("condition2", "=", 1)->get(); 

$query3 = clone($baseQuery); 
$query3Results = $query3->where("condition3", "=", 0)->get(); 

到时候我到$query3,它有3个,其中报表。代$query3 ... get()$query3 ... ->toSql();显示这些结果:

SELECT `column` FROM `models` WHERE `deleted_at` IS NULL AND `condition` = ? AND `condition2` = ? AND `condition3` = ?; 

看来,即使我定义每个$queryX作为$baseQuery克隆,附加条款->where()被应用到每个查询。在添加任何->where()子句之前,我已尝试执行clone(),但这没有任何影响。

有没有一种方法clone()东西,并确保它创建一个新的实例?它看起来像clone()不是从$queryX分离$baseQuery,所以->where() s正在应用于每个后续副本,即使每个应该是一个只有->whereNull()子句的新查询。

另一个有趣的一点是,运行

\Log::info($baseQuery == $queryX); 

每次修改后返回true===false虽然)

回答

1

你应该在这里使用scopes

本地范围允许您定义常见的一组约束,您可以在整个应用程序中轻松地重复使用这些约束。例如,您可能需要经常检索所有被认为“流行”的用户。要定义范围,只是前缀雄辩的模型方法与范围

public function scopeBase($q) 
{ 
    return $q->selectRaw('column')->whereNull('deleted_at'); 
} 

然后就做这样的事情:

$query1Results = $model->where('condition', 0)->base()->get(); 
$query2Results = $model->where('condition2', 1)->base()->get(); 
$query3Results = $model->where('condition3', 0)->base()->get(); 
+1

也做到了;不熟悉'QueryBuilder'的'scope'功能,对于将来的用例一定会牢记这一点。 –