我拼命地尝试对SQL请求进行排序:
我希望日期属性的每一行都小于实际日期。
这就是我正在做的事情:
$student = User::find($id)->student;
$extras = $student->extras->where('find', 1)
->where('date', '<', Carbon::now()->toDateString());
它返回一个空集合。这很奇怪,因为$student->extras->where('find', 1)
会返回:
Collection {#229 ▼
#items: array:1 [▼
0 => Extra {#236 ▼
#fillable: array:10 [▶]
#connection: null
#table: null
#primaryKey: "id"
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:14 [▼
"id" => 4
"broadcast" => 0
"type" => "Cuisine"
"date" => "2016-06-15"
"date_time" => "13:00:00"
"duration" => 2
"salary" => 500
"benefits" => "test2"
"requirements" => "test2"
"informations" => ""
"find" => 1
"professional_id" => 2
"created_at" => "2016-08-19 08:18:59"
"updated_at" => "2016-08-19 08:18:59"
]
如您所见,日期小于返回此值的Carbon::now()->toDateString()
:
2016-08-19
任何想法我做错了什么?
答案 0 :(得分:1)
请记住,当您使用该属性访问关系时(例如$student->extras
),结果已从数据库中提取,您使用Illuminate\Database\Eloquent\Collection
类来过滤数据。 https://github.com/laravel/framework/blob/5.2/src/Illuminate/Support/Collection.php#L282
如果您希望数据库查询结果,则需要使用关系的方法。 $student->extras()->where('find', 1)->where('date', '<', Carbon::now())->get();
另请注意,我没有在碳对象上调用->toDateString()
方法,通过执行此操作,查询构建器会将日期转换为数据库平台所需的正确格式。
编辑:
如果您真的想使用该集合来处理这个问题,您需要执行以下操作
$extras = $student->extras->filter(function($extra)
{
return $extra->date->lt(Carbon::now());
});
答案 1 :(得分:0)
您正在尝试将日期与字符串进行比较。试试这个:
->where('date', '<', Carbon::now());