0

想要在查询中生成多个结果。

    $now = Carbon::now();
    $currentStartDay = $now->startOfDay();
    $currentEndDay = $now->endOfDay();
    $currentStartWeek = $now->startOfWeek();
    $currentEndWeek = $now->endOfWeek();
    $currentStartMonth = $now->startOfMonth();
    $currentEndMonth = $now->endOfMonth();
    $currentStartYear = $now->startOfYear();
    $currentEndYear = $now->endOfYear();

    $query = DB::table('transactions AS t');

    $queryExpenseToday = $query;
    $queryExpenseWeek = $query;
    $queryExpenseMonth = $query;
    $queryExpenseYear = $query;

    dump($queryExpenseToday->whereBetween('t.created_at', [$currentStartDay, $currentEndDay])->toSql());
    dump($queryExpenseWeek->whereBetween('t.created_at', [$currentStartWeek, $currentEndWeek])->toSql());
    dump($queryExpenseMonth->whereBetween('t.created_at', [$currentStartMonth, $currentEndMonth])->toSql());
    dump($queryExpenseYear->whereBetween('t.created_at', [$currentStartYear, $currentEndYear])->toSql());

问题和输出如下:

第一次转储

"select * from `transactions` as `t` where `t`.`created_at` between ? and ?"

第二次转储

"select * from `transactions` as `t` where `t`.`created_at` between ? and ? and `t`.`created_at` between ? and ?"

第三次转储

"select * from `transactions` as `t` where `t`.`created_at` between ? and ? and `t`.`created_at` between ? and ? and `t`.`created_at` between ? and ?"

第四次转储

"select * from `transactions` as `t` where `t`.`created_at` between ? and ? and `t`.`created_at` between ? and ? and `t`.`created_at` between ? and ? and `t`.`created_at` between ? and ?"

正在附加查询,如何停止?或者如何取消绑定最后一个绑定参数?

我正在使用 Laravel 5.6

寻找最佳答案。

4

2 回答 2

1

重新实例化查询是什么意思?代替:

    ...
    $query = DB::table('transactions AS t');
    $queryExpenseToday = $query;
    $queryExpenseWeek = $query;
    ...

你可以这样做:

    ...
    $query = DB::table('transactions AS t');
    $queryExpenseToday = DB::table('transactions AS t');
    $queryExpenseWeek = DB::table('transactions AS t');
    ...

或者你也可以克隆它:

    ...
    $query = DB::table('transactions AS t');
    $queryExpenseToday = clone($query);
    $queryExpenseWeek = clone($query);
    ...

解释很简单。当您使用 DB 时,它会在内部创建一个新的 Object 实例,因此如果您使用$anyQuery=$query,您将处理对相同第一个 Object 的引用。因此,您必须创建一个新的(第一个选项)或克隆它,在内部创建一个新的(第二个选项)

您可以使用dd($anyQuery)它来检查它并围绕这个概念进行一些尝试。好看!

于 2018-08-19T15:20:47.340 回答
1

认为您正在处理对象,因此实际上您正在处理相同的实例。

所以通常你可以设置常见的查询代码,在你的情况下它只是:

$query = DB::table('transactions AS t');

但是如果你想向它添加不同的条件并有多个查询,你需要克隆它而不是:

$queryExpenseToday = $query;
$queryExpenseWeek = $query;
$queryExpenseMonth = $query;
$queryExpenseYear = $query;

你应该使用:

$queryExpenseToday = clone $query;
$queryExpenseWeek = clone $query;
$queryExpenseMonth = clone $query;
$queryExpenseYear = clone $query;

当然,您可以在一行中完成,因此您也可以像这样转储它(并在确保它确实有效后将其分配给变量):

dump((clone $query)->whereBetween('t.created_at', [$currentStartDay, $currentEndDay])->toSql());
于 2018-08-19T18:35:00.270 回答