Laravel 查询绑定和解除绑定
Laravel Query Bind and Unbind
想要在一个查询中生成多个结果。
$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
寻找最佳答案。
什么是重新实例化查询?而不是:
...
$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 时,它会在内部创建一个对象的新实例,因此如果您使用 $anyQuery=$query
,您将处理对同一个第一个对象的引用。因此,您必须创建一个新的(第一个选项)或克隆它,在内部创建一个新的(第二个选项)
您可以使用 dd($anyQuery)
来检查它并围绕这个概念玩一玩。
好看!
你的想法是你在这里处理对象,所以实际上你正在处理相同的实例。
所以通常你可以设置通用查询代码,在你的情况下它只是:
$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());
想要在一个查询中生成多个结果。
$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
寻找最佳答案。
什么是重新实例化查询?而不是:
...
$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 时,它会在内部创建一个对象的新实例,因此如果您使用 $anyQuery=$query
,您将处理对同一个第一个对象的引用。因此,您必须创建一个新的(第一个选项)或克隆它,在内部创建一个新的(第二个选项)
您可以使用 dd($anyQuery)
来检查它并围绕这个概念玩一玩。
好看!
你的想法是你在这里处理对象,所以实际上你正在处理相同的实例。
所以通常你可以设置通用查询代码,在你的情况下它只是:
$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());