日期比较Eloquent' where'方法不起作用

时间:2016-08-19 11:52:11

标签: sql laravel eloquent php-carbon

我拼命地尝试对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

任何想法我做错了什么?

2 个答案:

答案 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());