Laravel 查询两个参数与三个参数 'where' 子句之间(相同?)的不同结果
Laravel query different result between (identical?) two vs three argument 'where' clause
我在 laravel (5.2) 中遇到一个非常奇怪的问题 - 我从一些外部源(API)创建了一个 collection,我正在尝试 运行 '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,其中 'spent-at' 等于 该月的第一天 - 应该有一个入口。如果我 不 显式指定比较运算符,我会得到预期的结果:
$entriesThisMonth = $entries->where('spent-at', $thisMonthStart);
//one $entries returned, see end of post
但是,如果我指定 = 运算符
$entriesThisMonth = $entries->where('spent-at', '=', $thisMonthStart);
//empty collection returned
所以我现在很困惑 - 大概是我原来的 collection 出了点问题,但为什么指定与不指定运算符有什么区别?我本以为这两个查询会给出相同的结果?
(显然,无法指定运算符在尝试进行 < 或 > 比较时不是很有帮助,但我主要只是对这两种语法之间的实际区别感兴趣,所以为什么他们给出不同的结果?)
我在任何地方都找不到关于这两个版本的查询如何工作的任何信息,因此如果预计它们会给出不同的结果 - 我认为它们应该相同,但也许有人有更深入的了解可以解释是什么原因造成的吗?
感谢任何能揭开谜底的人!
$entries 的示例 collection 万一有用(只是一条记录):
(注意肯定有当月的记录,我知道这个例子太旧了)
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"
}
]
}
方法 illuminate\Support\Collection::where
与数据库集合不同,它不将运算符作为第二个参数。
您正在使用的集合对象的 where
方法签名是 where(string $key, mixed $value, bool $strict = true)
您使用运算符的第二个示例是在集合中查找与字符串 '='
.
匹配的所有元素
要进一步阅读您正在使用的集合(不是 eloquent 集合),请查看 here
要获得您期望的 15 个结果,请对集合使用 filter
方法。
按照这些思路应该可行:
$entriesThisMonth = $entries->filter (function ($e) use ($thisMonthStart) {
return $e ['spent-at'] > $thisMonthStart;
});
解决您的问题... "returns an empty collection, but should have 15 results"。如果集合已经存在,您需要 filter
结果。像这样:
$thisMonthStart = new Carbon('first day of this month');
$entriesThisMonth = $entries->filter(function ($entry) use ($thisMonthStart) {
return $entry['spent-at'] >= $thisMonthStart;
});
我在 laravel (5.2) 中遇到一个非常奇怪的问题 - 我从一些外部源(API)创建了一个 collection,我正在尝试 运行 '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,其中 'spent-at' 等于 该月的第一天 - 应该有一个入口。如果我 不 显式指定比较运算符,我会得到预期的结果:
$entriesThisMonth = $entries->where('spent-at', $thisMonthStart);
//one $entries returned, see end of post
但是,如果我指定 = 运算符
$entriesThisMonth = $entries->where('spent-at', '=', $thisMonthStart);
//empty collection returned
所以我现在很困惑 - 大概是我原来的 collection 出了点问题,但为什么指定与不指定运算符有什么区别?我本以为这两个查询会给出相同的结果?
(显然,无法指定运算符在尝试进行 < 或 > 比较时不是很有帮助,但我主要只是对这两种语法之间的实际区别感兴趣,所以为什么他们给出不同的结果?)
我在任何地方都找不到关于这两个版本的查询如何工作的任何信息,因此如果预计它们会给出不同的结果 - 我认为它们应该相同,但也许有人有更深入的了解可以解释是什么原因造成的吗?
感谢任何能揭开谜底的人!
$entries 的示例 collection 万一有用(只是一条记录): (注意肯定有当月的记录,我知道这个例子太旧了)
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"
}
]
}
方法 illuminate\Support\Collection::where
与数据库集合不同,它不将运算符作为第二个参数。
您正在使用的集合对象的 where
方法签名是 where(string $key, mixed $value, bool $strict = true)
您使用运算符的第二个示例是在集合中查找与字符串 '='
.
要进一步阅读您正在使用的集合(不是 eloquent 集合),请查看 here
要获得您期望的 15 个结果,请对集合使用 filter
方法。
按照这些思路应该可行:
$entriesThisMonth = $entries->filter (function ($e) use ($thisMonthStart) {
return $e ['spent-at'] > $thisMonthStart;
});
解决您的问题... "returns an empty collection, but should have 15 results"。如果集合已经存在,您需要 filter
结果。像这样:
$thisMonthStart = new Carbon('first day of this month');
$entriesThisMonth = $entries->filter(function ($entry) use ($thisMonthStart) {
return $entry['spent-at'] >= $thisMonthStart;
});