Laravel查询(相同?)两个与三个参数“where”子句之间的不同结果

Laravel查询(相同?)两个与三个参数“where”子句之间的不同结果,laravel,where-clause,laravel-query-builder,Laravel,Where Clause,Laravel Query Builder,我对Laravel5.2中的一个查询有一个非常奇怪的问题——我从外部源API创建了一个集合,我正在尝试运行一个“where”查询来提取特定的记录 最初,我试图提取当月提交的所有条目,因此,在本月的第一天之后 $entries is the starting collection (time entries on a project - see end of post) $thisMonthStart = (new Carbon('first day of this month'))->t

我对Laravel5.2中的一个查询有一个非常奇怪的问题——我从外部源API创建了一个集合,我正在尝试运行一个“where”查询来提取特定的记录

最初,我试图提取当月提交的所有条目,因此,在本月的第一天之后

$entries is the starting collection (time entries on a project - see end of post)

$thisMonthStart = (new Carbon('first day of this month'))->toDateString();
  //value of this is 2017-02-01, and the issue is not resolved if I remove toDateString()

$entriesThisMonth = $entries->where('spent-at', '>', $thisMonthStart); 
  //returns an empty collection, but should have 15 results
现在,真正奇怪的是,我试图得到$entries,其中“花在”等于一个月的第一天——应该有一个条目。如果我没有明确指定比较运算符,我将得到预期结果:

$entriesThisMonth = $entries->where('spent-at', $thisMonthStart);
  //one $entries returned, see end of post
但是,如果我指定=运算符

$entriesThisMonth = $entries->where('spent-at', '=', $thisMonthStart);
  //empty collection returned
所以我现在非常困惑——我的原始集合可能有问题,但是为什么指定运算符和不指定运算符会有任何区别呢?我本以为这两个查询会给出相同的结果

显然,在尝试进行<或>比较时,不能指定运算符不是很有帮助,但我最感兴趣的是这两个语法之间的实际差异,以及为什么它们给出不同的结果

我在任何地方都找不到关于这两个版本的查询如何工作的任何信息,因此如果预期它们会给出不同的结果-我认为它们应该是相同的,但也许有更深入了解的人可以解释是什么导致了这一点

感谢所有能够揭开神秘面纱的人

$entries集合的一个示例在任何情况下都是有用的,只有一条记录: 注意:肯定有当月的记录,我知道这个例子太旧了

Collection {#952 ▼
  #items: array:367 [▼
175412141 => DayEntry {#958 ▼
  #_root: "request"
  #_convert: true
  #_values: array:16 [ …16]
  +"id": "175412141"
  +"notes": ""
  +"spent-at": "2013-10-03"
  +"hours": "0.75"
  +"user-id": "595841"
  +"project-id": "4287629"
  +"task-id": "2448666"
  +"created-at": "2013-10-03T18:07:54Z"
  +"updated-at": "2013-11-01T12:50:51Z"
  +"adjustment-record": "false"
  +"timer-started-at": ""
  +"is-closed": "false"
  +"is-billed": "true"
  +"started-at": "10:45"
  +"ended-at": "11:30"
  +"invoice-id": "3633772"
}
这是where查询不带运算符返回的结果:

Collection {#954 ▼
  #items: array:1 [▼
568944822 => DayEntry {#1310 ▼
  #_root: "request"
  #_convert: true
  #_values: array:15 [▶]
  +"id": "568944822"
  +"notes": "Tweaking formatting on job ads and re shuffling ad order"
  +"spent-at": "2017-02-01"
  +"hours": "0.25"
  +"user-id": "595841"
  +"project-id": "4287629"
  +"task-id": "2448666"
  +"created-at": "2017-02-01T14:45:00Z"
  +"updated-at": "2017-02-01T14:45:00Z"
  +"adjustment-record": "false"
  +"timer-started-at": ""
  +"is-closed": "false"
  +"is-billed": "false"
  +"started-at": "14:30"
  +"ended-at": "14:45"
}
]
}
方法illumb\Support\Collection::where与数据库集合where不同,它不将运算符作为第二个参数

您正在使用的集合对象的where方法签名是wherestring$key,mixed$value,bool$strict=true

运算符的第二个示例是查找集合中与字符串“=”匹配的所有元素

要进一步阅读您正在使用的系列,请不要使用雄辩的系列外观

要获得预期的15个结果,请对集合使用filter方法

按照这些思路应该可以做到:

$entriesThisMonth = $entries->filter (function ($e) use ($thisMonthStart) {

    return $e ['spent-at'] > $thisMonthStart;

});
方法illumb\Support\Collection::where与数据库集合where不同,它不将运算符作为第二个参数

您正在使用的集合对象的where方法签名是wherestring$key,mixed$value,bool$strict=true

运算符的第二个示例是查找集合中与字符串“=”匹配的所有元素

要进一步阅读您正在使用的系列,请不要使用雄辩的系列外观

要获得预期的15个结果,请对集合使用filter方法

按照这些思路应该可以做到:

$entriesThisMonth = $entries->filter (function ($e) use ($thisMonthStart) {

    return $e ['spent-at'] > $thisMonthStart;

});
要解决您的问题。。。返回空集合,但应有15个结果。如果集合已存在,则需要筛选结果。大概是这样的:

$thisMonthStart = new Carbon('first day of this month');

$entriesThisMonth = $entries->filter(function ($entry) use ($thisMonthStart) {
    return $entry['spent-at'] >= $thisMonthStart;
});
要解决您的问题。。。返回空集合,但应有15个结果。如果集合已存在,则需要筛选结果。大概是这样的:

$thisMonthStart = new Carbon('first day of this month');

$entriesThisMonth = $entries->filter(function ($entry) use ($thisMonthStart) {
    return $entry['spent-at'] >= $thisMonthStart;
});

类型为illumb/Support/Collection的对象上的get方法只是通过键从集合中检索元素,并要求返回项的键作为参数传递,以便工作。上面的例子不起作用,只是注意到,如果$entries集合已经存在,那么您是对的。他需要过滤结果。正如Keir正确猜测的那样,不幸的是,这不是一个有说服力的集合,所以get不起作用-但是过滤选项确实起作用,所以谢谢你,也谢谢Kier!我将接受Kier的回答,因为他们的回答更深入地阐述了不同where查询之间的区别,但也谢谢大家!:当然可以+我虽然,我会很感激,特别是因为凯尔与我的过滤器想法lol滚动;站在巨人的肩膀上p删除了my-1,因为您的答案现在是正确的。对于类型为illumb/Support/Collection的对象,get方法只需通过键从集合中检索元素,并要求返回项的键作为参数传递即可。上面的例子不起作用,只是注意到,如果$entries集合已经存在,那么您是对的。他需要过滤结果。正如Keir正确猜测的那样,不幸的是,这不是一个有说服力的集合,所以get不起作用-但是过滤选项确实起作用,所以谢谢你,也谢谢Kier!我将接受Kier的回答,因为他们的回答更深入地阐述了不同where查询之间的区别,但也谢谢大家!:当然可以+但是我会很感激的,
特别是自从Keir和我的过滤器想法一起滚动lol;站在巨人的肩膀上p删除了我的-1,因为你的答案现在对该解决方案以及解释和链接都是正确的。我不知道两者之间的where方法是不同的,所以我会仔细阅读!我稍微修改了您的代码以使其正常工作,因为laravel使用数组表示法对$entries抛出了一个错误,并添加了>=,但非常准确,谢谢!:$EntriestThisMonth=$entries->filterfunction$i use$thisMonthStart{return$i->{在}>=$thisMonthStart;};谢谢你的解决方案,还有解释和链接——我不知道两者的where方法是不同的,所以我会仔细阅读!我稍微修改了您的代码以使其正常工作,因为laravel使用数组表示法对$entries抛出了一个错误,并添加了>=,但非常准确,谢谢!:$EntriestThisMonth=$entries->filterfunction$i use$thisMonthStart{return$i->{在}>=$thisMonthStart;};